有谁知道为什么这个C代码不会编译?

时间:2011-09-03 22:53:02

标签: 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,它会编译。 这是错误:

employee.c:5:14:错误:在文件范围内修改了'NameType' employee.c:6:14:错误:在文件范围内修改了'AddrType'

3 个答案:

答案 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)

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

Incompatibilities Between ISO C and ISO C++