在一个项目中,我需要定义一个const int,我在头文件中定义它:
extern const int a;
我多次包含该标题。然后在一个源文件中,我把:
const int a=10;
但是当我需要在数组绑定中使用a时;即:
int anarray[a];
我明白了:
"array bound is not an integer constant"
错误。为什么呢?
答案 0 :(得分:12)
数组绑定必须是整数常量表达式。要成为整数常量表达式,表达式必须仅涉及(在其他一些事物中)文字,enum
值和const
变量或static
数据成员< strong>仅当使用常量表达式 初始化它们时。
const
整数类型的变量如果没有初始值设定项,则不是整数常量表达式。
这是一种语言规则,允许实现在编译时知道某些常量值,而不必了解其他翻译单元(可能不会同时编译,也可能单独更改)。
命名空间范围内的 const
变量默认情况下具有内部链接(即没有明确的extern
),因此如果您执行此类操作,则不会出现任何多重定义问题。
// header.h
const int a = 10;
// source.cpp
int anarray[a];
答案 1 :(得分:5)
需要在编译时知道数组维度。对于诸如此类的常量,您可能需要考虑使用枚举。这样它的值在标题中可见,并且在调试时仍然会得到符号名称(与使用#define不同)。
// foo.h
enum {
a = 10; // array dimension
};
和
// foo.c
#include "foo.h"
int anarray[a];
答案 2 :(得分:2)
需要在编译时知道常量的值。 extern
变量不是这样的:如果有的话,它们的值只能在链接时确定,这在编译步骤之后。因此,就编译器而言,extern
不是常量。