在以下代码中,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.常量表达式的东西,可以在编译时被评估-数字文字等10或3.14159,字符串文字等"Hello"中,sizeof表达,或由相同等的一些表达10 + sizeof "Hello".
对于文件范围(在任何函数体外)的数组声明或作为成员struct或union类型,数组维必须是常量表达式.
对于auto数组(在函数体内声明的数组不是static),可以使用一个变量或表达式,其值在运行时才知道,但仅限于C99或更高版本.
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页
有两种方法可以处理它:
#define而不是constenum { sz = 12 };以非常简单的方式,因为编译器必须在编译时知道数组的维度,并且由于您可以const variable在运行时初始化,所以您不能这样做。所以静态声明的数组的大小必须是常量表达式,而 aconst variable不是。对于 常量表达式,您应该使用宏 ( #define) 或enum. 这明确适合您的情况(在文件范围内),并且如果您使用c99.
| 归档时间: |
|
| 查看次数: |
4903 次 |
| 最近记录: |