【问题标题】:Anyone know why this C code won't compile?任何人都知道为什么这个 C 代码不会编译?
【发布时间】:2011-09-03 22:53:01
【问题描述】:
#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”

【问题讨论】:

  • 它给出了什么错误?
  • 不应该是const int而不是int const吗?
  • int const 在 C++ 中有效 - 不确定他们是否也使相同的东西在 C 中有效。
  • 也许是这样..我把它们换了,它仍然无法编译..我使用的是 gcc 4.5.3

标签: c


【解决方案1】:

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)中,即使使用本地数组,代码也无法编译。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2022-09-27
      • 2017-04-22
      • 2018-01-30
      • 2021-08-15
      相关资源
      最近更新 更多