Цитирование отрывка из ссылки C на cppreference.com:
При инициализации объекта stati c или продолжительности локального хранилища потока каждое выражение в инициализаторе должно быть константное выражение или строковый литерал.
Инициализаторы для объектов stati c (например, graph
) должны быть известны во время компиляции, поскольку инициализированная память для этих переменных находится в объектном файле, сгенерированном компилятором. Как таковые, они не могут содержать вызовы функций.
$ cat a.c
int a = 7;
int b = 8;
int c = 9;
$ gcc -c a.c
$ objdump -t -s -j .data a.o
a.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 g O .data 0000000000000004 a
0000000000000004 g O .data 0000000000000004 b
0000000000000008 g O .data 0000000000000004 c
Contents of section .data:
0000 07000000 08000000 09000000 ............
Назначения в функциях оцениваются во время вызова функции (если вообще) и, следовательно, могут содержать вызовы функций.