任何人都知道为什么这个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' 在文件范围

+1

没有给出什么错误? –

+1

[文件范围内可变修改数组]的可能重复(http://*.com/questions/1712592/variably-modified-array-at-file-scope) –

+2

不应该是'const int'而不是' int const'? –

一个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),即使使用本地数组,代码也不会编译。

+0

感谢您的解释 –

这些常量声明在C中只是定义了一些只读存储器,它们不是真正的常量。直到运行时才能评估它们,这对于数组声明来说太晚了。

+0

啊好吧我现在看到...谢谢 –

虽然问题已经回答了,我想你应该通过这个链接:

Incompatibilities Between ISO C and ISO C++

+0

我一定会检查出来。谢谢 –