在C中,为什么const变量不能用作数组大小初始值设定项?

Mah*_*mam 12 c

在以下代码中,const int不能用作数组大小:

const int sz = 0;
typedef struct
{
   char s[sz];
} st;

int main()
{
   st obj;
   strcpy(obj.s, "hello world");
   printf("%s", obj.s);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ode 13

在C中,const合格变量不是常量表达式1.常量表达式的东西,可以在编译时被评估-数字文字等103.14159,字符串文字等"Hello"中,sizeof表达,或由相同等的一些表达10 + sizeof "Hello".

对于文件范围(在任何函数体外)的数组声明或作为成员structunion类型,数组维必须是常量表达式.

对于auto数组(在函数体内声明的数组不是static),可以使用一个变量或表达式,其值在运行时才知道,但仅限于C99或更高版本.


  1. C++在这方面有所不同 - 在那种语言中,一个const合格的变量确实算作一个常量表达式.


syn*_*gma 13

这是因为在C中const实际上意味着只读.引用C FAQ 1.18和1.19:

const限定符实际上意味着"只读"; 一个如此限定的对象是一个不能(通常)分配给它的运行时对象.因此,const限定对象的值在术语的完整意义上不是常量表达式,并且不能用于数组维度,案例标签等.(在这方面,C与C++不同.)当您需要真正的编译时常量时,请使用预处理器#define(或者可能是枚举).

参考文献:ISO Sec.6.4 H&S Secs.7.11.2,7.11.3第226-7页

有两种方法可以处理它:

  1. #define而不是const
  2. 使用 enum { sz = 12 };


sim*_*o-r 5

以非常简单的方式,因为编译器必须在编译时知道数组的维度,并且由于您可以const variable在运行时初始化,所以您不能这样做。所以静态声明的数组的大小必须常量表达式,而 aconst variable不是。对于 常量表达式,您应该使用宏 ( #define) 或enum. 这明确适合您的情况(在文件范围内),并且如果您使用c99.