繁体   English   中英

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

[英]Anyone know why this C code won't compile?

#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:错误:在文件范围employee.c:6:14:错误地修改了'NameType':在文件范围内修改了'AddrType'

C和C ++之间的区别之一是在C ++中, const int对象是一个常量 ,即它可以用于形成常量表达式 另一方面,在C中, const int对象根本不是常量(它更像是“不可变的变量 ”)。

同时,C中文件范围数组的数组大小必须是一个常量表达式 ,这就是你的const int对象在该角色中不起作用的原因。 (上面的意思是BTW,你的代码将作为C ++完全编译,但不会编译为C.)

在C语言中定义命名常量,您必须使用#define或enums。 在您的具体情况下,可以按如下方式完成

#define NAMESIZE 40
#define ADDRSIZE 80

PS如果用本地数组替换文件范围数组,则C代码将按原样编译,即使用const int对象作为数组大小,因为现代C(ANSI C99)支持本地范围内的可变长度数组(VLA)。 (在这种情况下,你的阵列将是VLA)。 在旧版本的C(如ANSI C89 / 90)中,即使使用本地数组,代码也无法编译。

这些const声明在C中只定义了一些只读内存,它们不是真正的常量。 直到运行时才能对它们进行求值,这对于数组声明来说太迟了。

虽然问题已得到解答,但我认为您应该通过以下链接:

ISO C和ISO C ++之间的不兼容性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM