gpt4 book ai didi

c - 任何人都知道为什么这个 C 代码不能编译?

转载 作者:行者123 更新时间:2023-12-02 05:31:28 25 4
gpt4 key购买 nike

#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”

最佳答案

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

与此同时,C 中文件范围数组的数组大小必须是常量表达式,这就是为什么您的const int 对象在该角色中不起作用。 (顺便说一句,上面的意思是你的代码可以像 C++ 一样完美地编译,但不会像 C 那样编译。)

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

#define NAMESIZE 40
#define ADDRSIZE 80

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

关于c - 任何人都知道为什么这个 C 代码不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7296356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com