15

I am creating an array on stack as

static const int size = 10;

void foo() {
..
int array[size];
..
}

However, I get the compile error: "expression must have a constant value", even though size is a constant. I can use the macro

#define SIZE (10)

But I am wondering why size marked const causes compilation error.

Fiddling Bits
  • 8,712
  • 3
  • 28
  • 46
Iceman
  • 4,202
  • 7
  • 26
  • 39

3 Answers3

28

In C language keyword const has nothing to do with constants. In C language, by definition the term "constant" refers to literal values and enum constants. This is what you have to use if you really need a constant: either use a literal value (define a macro to give your constant a name), or use a enum constant.

(Read here for more details: Shall I prefer constants over defines?)

Also, in C99 and later versions of the language it possible to use non-constant values as array sizes for local arrays. That means that your code should compile in modern C even though your size is not a constant. But you are apparently using an older compiler, so in your case

#define SIZE 10

is the right way to go.

Community
  • 1
  • 1
AnT stands with Russia
  • 312,472
  • 42
  • 525
  • 765
4

The answer is in another stackoverflow question, HERE

it's because In C objects declared with the const modifier aren't true constants. A better name for const would probably be readonly - what it really means is that the compiler won't let you change it. And you need true constants to initialize objects with static storage (I suspect regs_to_read is global).

Community
  • 1
  • 1
Yann
  • 318
  • 1
  • 14
0

if you are on C99 your IDE compiler option may have a thing called variable-length array (VLA) enable it and you won't get compile error, efficiently without stressing your code though is with MALLOC or CALLOC.

static const int size = 10;

void foo() {
    int* array;
    array = (int *)malloc(size * sizeof(int));
}
Tamir Abutbul
  • 7,301
  • 7
  • 25
  • 53
yonas mekonen
  • 51
  • 1
  • 7