任何人都知道为什么这个C代码不会编译?
#include <stdio.h>
int const NAMESIZE = 40;
int const ADDRSIZE = 80;
typedef char NameType[NAMESIZE];
typedef char AddrType[ADDRSIZE];
typedef struct
{
NameType name;
AddrType address;
double salary;
unsigned int id;
}EmpRecType;
int main(int * argc, char * argv[])
{
EmpRecType employee;
return 0;
}
如果我使用#define而不是const,它会编译。 这是错误:任何人都知道为什么这个C代码不会编译?
employee.c:5:14:错误:6:14:错误:可变地在文件范围 employee.c改性 'NAMETYPE' 可变改性 'ADDRTYPE' 在文件范围
一个C和C++之间的差异是,在C++中const int
对象是恒定,即,它可被用来形成常量表达式。在C中,另一方面,const int
对象根本不是常量(更像是“不可更改的变量”)。
同时,C中文件范围数组的数组大小必须是常量表达式,这就是为什么您的const int
对象不起作用的原因。 (上面的意思是,顺便说一句,你的代码将完美地编译为C++,但不会编译为C.)
在定义命名常量的C语言中,您必须使用#define
或enums。在你的具体情况下,它可以按如下方式完成:
#define NAMESIZE 40
#define ADDRSIZE 80
P.S.如果用本地数组替换文件范围数组,则C代码将按原样编译,即将const int
对象作为数组大小,因为现代C(ANSI C99)支持局部范围内的可变长度数组(VLA)。 (在这种情况下你的阵列将是VLA)。在较旧版本的C中(如ANSI C89/90),即使使用本地数组,代码也不会编译。
感谢您的解释 –
这些常量声明在C中只是定义了一些只读存储器,它们不是真正的常量。直到运行时才能评估它们,这对于数组声明来说太晚了。
啊好吧我现在看到...谢谢 –
没有给出什么错误? –
[文件范围内可变修改数组]的可能重复(http://*.com/questions/1712592/variably-modified-array-at-file-scope) –
不应该是'const int'而不是' int const'? –