Я пытаюсь инициализировать C-структуру, используя следующий код:Инициализация массива структур (ошибка компилятора: инициализатор элемент не является постоянной)
/* header file */
typedef struct _funky {
int func_id; /* I know this should be intptr_t, but ignore for now ... */
char func_name[MAX_FUNC_NAME_LEN];
} Funky;
double func1(double d1, double d2, double d3);
double func2(double d1, double d2, double d3);
double func3(double d1, double d2, double d3);
double func4(double d1, double d2, double d3);
/* .c file */
Funky fk[4] = {
{(int)func1, "func1"}, /* <- gcc barfs here ... */
{(int)func2, "func2"},
{(int)func3, "func3"},
{(int)func4, "func4"}
};
При попытке скомпилировать этот (GCC 4.6.3) , Я получаю следующие ошибки:
error: initializer element is not constant
error: (near initializer for 'fk[0].func_id')
Как я могу исправить эту ошибку?
[[Edit]]
После краткой беседы с ouah, я нашел причину этой ошибки - это делать с определением функций, которые используются для инициализации массива. Некоторые из определений находятся в разных единицах перевода, а другие - в разных модулях. Все это означает (IIUC), что функции не будут определены во время компиляции.
Недостаточно написания функции инициализации (которая потребует обширного мод в существующем коде). Я не уверен, как это решить - и я не уверен, как она была скомпилирована в предыдущих версиях gcc.
Это не должно быть intptr_t, это должен быть правильный указатель функции. Зачем игнорировать его, поскольку это, вероятно, ядро вашей проблемы? – Mat
@Mat: Это поле в структуре также используется для хранения целых чисел в частях кода. Я работаю с устаревшим кодом, и эта структура используется в более чем 5k файлах - иногда в поле хранится int, а в других случаях он содержит необработанный ptr. Лучшее, что я могу сделать, это изменить его на intptr_t, это потребует наименьшей модификации для тела существующего кода. –
«intptr_t' не гарантированно может удерживать значение указателя функции без потери информации, хотя, вероятно, это возможно. (Вероятно, 'uintptr_t' будет иметь немного больше смысла, чем' intptr_t'.) –