#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,它会编译。 这是错误:
employee.c:5:14:错误:在文件范围内修改了'NameType' employee.c:6:14:错误:在文件范围内修改了'AddrType'
答案 0 :(得分:9)
C和C ++之间的区别之一是,在C ++中,const int
对象是常量,即它可以用于形成常量表达式。另一方面,在C中,const int
对象根本不是常量(它更像是“不可改变的变量”)。
同时,C中文件范围数组的数组大小必须是常量表达式,这就是您的const int
对象在该角色中不起作用的原因。 (上面的意思是BTW,你的代码将编译为C ++,但不会编译为C语言。)
在C语言中定义命名常量,您必须使用#define
或枚举。在您的具体情况下,可以按如下方式完成
#define NAMESIZE 40
#define ADDRSIZE 80
P.S。如果用本地数组替换文件范围数组,则C代码将按原样编译,即使用const int
对象作为数组大小,因为现代C(ANSI C99)支持局部范围内的可变长度数组(VLA) 。 (在这种情况下,你的阵列将是VLA)。在旧版本的C(如ANSI C89 / 90)中,即使使用本地数组,代码也不会编译。
答案 1 :(得分:7)
这些const声明在C中只定义了一些只读内存,它们不是真正的常量。直到运行时才能对它们进行求值,这对于数组声明来说太迟了。
答案 2 :(得分:5)
虽然问题已经回答,但我认为你应该通过这个链接: