Error "initializer element is not constant" when trying to initialize variable with const Error "initializer element is not constant" when trying to initialize variable with const c c

Error "initializer element is not constant" when trying to initialize variable with const


In C language, objects with static storage duration have to be initialized with constant expressions, or with aggregate initializers containing constant expressions.

A "large" object is never a constant expression in C, even if the object is declared as const.

Moreover, in C language, the term "constant" refers to literal constants (like 1, 'a', 0xFF and so on), enum members, and results of such operators as sizeof. Const-qualified objects (of any type) are not constants in C language terminology. They cannot be used in initializers of objects with static storage duration, regardless of their type.

For example, this is NOT a constant

const int N = 5; /* `N` is not a constant in C */

The above N would be a constant in C++, but it is not a constant in C. So, if you try doing

static int j = N; /* ERROR */

you will get the same error: an attempt to initialize a static object with a non-constant.

This is the reason why, in C language, we predominantly use #define to declare named constants, and also resort to #define to create named aggregate initializers.


It's a limitation of the language. In section 6.7.8/4:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

In section 6.6, the spec defines what must considered a constant expression. No where does it state that a const variable must be considered a constant expression. It is legal for a compiler to extend this (6.6/10 - An implementation may accept other forms of constant expressions) but that would limit portability.

If you can change my_foo so it does not have static storage, you would be okay:

int main(){    foo_t my_foo = foo_init;    return 0;}


Just for illustration by compare and contrastThe code is from http://www.geeksforgeeks.org/g-fact-80//The code fails in gcc and passes in g++/

#include<stdio.h>int initializer(void){    return 50;}int main(){    int j;    for (j=0;j<10;j++)    {        static int i = initializer();        /*The variable i is only initialized to one*/        printf(" value of i = %d ", i);        i++;    }    return 0;}