Я получаю сообщение об ошибке в строке 6 (инициализация my_foo для foo_init) следующей программы, и я не уверен, что понимаю почему.
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
Имейте в виду, что это упрощенная версия большого многофайлового проекта, над которым я работаю. Цель состояла в том, чтобы в объектном файле была одна константа, которую несколько файлов могли бы использовать для инициализации структуры состояний. Так как это встроенная цель с ограниченными ресурсами и структура не такая маленькая, я не хочу иметь несколько копий исходного кода. Я бы предпочел не использовать:
#define foo_init { 1, 2, 3 }
Я также пытаюсь написать переносимый код, поэтому мне нужно решение, которое действительно C89 или C99.
Связано ли это с ORG в объектном файле? Что инициализированные переменные входят в одну ORG и инициализируются путем копирования содержимого второй ORG?
Может быть, мне просто нужно изменить свою тактику и сделать так, чтобы функция инициализации делала все копии при запуске. Разве есть другие идеи?
источник
enum { N = 5 };
недооценивается способ объявления констант без необходимости прибегать к#define
.static int* ptr = malloc(sizeof(int)*5);
но это НЕ ошибкаstatic int* ptr; ptr = malloc(sizeof(int)*5);
:: DЭто ограничение языка. В разделе 6.7.8 / 4:
В разделе 6.6 спецификация определяет, что должно считаться константным выражением. Нет, где говорится, что переменная const должна считаться константным выражением. Это допустимо для компилятора расширять this (
6.6/10 - An implementation may accept other forms of constant expressions
), но это ограничит переносимость.Если вы можете изменить
my_foo
его, чтобы у него не было статического хранилища, все было бы в порядке:источник
static const int x = 3; static int y = x;
.Просто для иллюстрации путем сравнения и контрастирования Код взят с http://www.geeksforgeeks.org/g-fact-80/ / Код не работает в gcc и передается в g ++ /
источник
Это немного устарело, но я столкнулся с похожей проблемой. Вы можете сделать это, если вы используете указатель:
источник
GCC 7.4.0 не может скомпилировать коды, как показано ниже:
constchar.c: 3: 21: ошибка: элемент инициализатора не является константным const char * str2 = str1;
Фактически, строка "const char *" не является константой времени компиляции, поэтому она не может быть инициализатором. Но строка "const char * const" является константой времени компиляции, она должна быть в состоянии быть инициализатором. Я думаю, что это небольшой недостаток CLang.
Имя функции, конечно, является константой времени компиляции. Так что этот код работает:
источник
str1
нет выражения для пункта 6.7.9 «Инициализация» , пункт 4 : «Все выражения в инициализаторе для объекта, который имеет статическую или потоковую длительность хранения, должны быть константными выражениями или строковыми литералами».