У меня есть функция, которая принимает структуру, и я пытаюсь сохранить ее переменные в массиве:
int detect_prm(Param prm) {
int prm_arr[] = {prm.field1, prm.field2, prm.field3};
return 0;
}
Но с gcc -Wall -ansi -pedantic-errors -Werror я получаю следующую ошибку:
initializer element is not computable at load time
Мне кажется, что не так?





Это недопустимо в C. Списки инициализаторов должны быть постоянными выражениями времени компиляции. Вместо этого сделайте следующее:
int prm_arr[3];
prm_arr[0] = prm.field1;
prm_arr[1] = prm.field2;
prm_arr[2] = prm.field3;
Ответ Майка абсолютно правильный.
Однако, если вы можете использовать расширения GNU C или вместо этого использовать более новый и лучший стандарт C99 (используйте параметр --std=c99), то такие инициализаторы, как этот, совершенно законны. Стандарт C99 отсутствует уже 9 лет, и большинство компиляторов C поддерживают его достаточно хорошо ... особенно эту функцию.
К вашему сведению, Visual Studio 2008 (который официально поддерживает только C89) выдает следующее предупреждение на /W4: warning C4221: nonstandard extension used : 'nxstate' : cannot be initialized using address of automatic variable 'x'. Однако сгенерированная сборка выглядит нормально, поэтому я бы сказал, что вы можете положиться на эту функцию даже в MSVC.
Visual Studio официально не поддерживает C99 до 2013 г.. Только на 14 лет позже. челка
что требует вечеринки!
Незаконно в C89, что является стандартом, подразумеваемым -ansi; допустимо в C99, что можно включить, используя -std = c99 вместо -ansi.