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

时间:2017-05-30 16:51:30

标签: 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;
}

3 个答案:

答案 0 :(得分:12)

在C中,const - 限定变量不是常量表达式 1 。常量表达式可以在编译时进行评估 - 像103.14159这样的数字文字,像"Hello"这样的字符串文字,sizeof表达式或某个表达式由10 + sizeof "Hello"组成。

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

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

<小时/>

  1. C ++在这方面有所不同 - 在该语言中,const - 限定变量 计为常量表达式。

答案 1 :(得分:12)

这是因为在C const实际上意味着只读。引用C FAQ 1.18 and 1.19

  

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

     

参考文献:ISO Sec。 6.4   H&amp; S Secs。 7.11.2,7.11.3 pp.226-7

有两种方法可以处理它:

  1. 使用#define代替const
  2. 使用enum { sz = 12 };

答案 2 :(得分:3)

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