C++ 如何在.h文件中正确定义常量int?

C++ 如何在.h文件中正确定义常量int?,c++,header,C++,Header,在项目中,我需要定义一个常量int,我在标题中定义它为: extern const int a; 我多次使用这个标题。然后在一个源文件中,我将: const int a=10; 但是当我需要在数组绑定中使用时;i、 e: int anarray[a]; 我得到: "array bound is not an integer constant" 错误。为什么?需要在编译时知道数组维度。对于这样的常量,您可能需要考虑使用枚举来代替。这样,它的值在标题中是可见的,并且在调试时仍然可以获得符号

在项目中,我需要定义一个常量int,我在标题中定义它为:

 extern const int a;
我多次使用这个标题。然后在一个源文件中,我将:

const int a=10;
但是当我需要在数组绑定中使用时;i、 e:

int anarray[a];
我得到:

"array bound is not an integer constant"

错误。为什么?

需要在编译时知道数组维度。对于这样的常量,您可能需要考虑使用枚举来代替。这样,它的值在标题中是可见的,并且在调试时仍然可以获得符号名(与使用#define不同)


常量的值需要在编译时知道
extern
变量并非如此:如果有的话,它们的值只能在编译步骤之后的链接时间确定。因此,就编译器而言,
extern
不是常量。

数组绑定必须是整数常量表达式。要成为整型常量表达式,表达式必须仅涉及(除其他一些内容外)文字、
enum
值和
const
变量,或
static
数据成员,前提是它们是用常量表达式初始化的

const
整数类型的变量如果没有初始值设定项,则不是整型常量表达式

这是一种语言规则,允许实现在编译时知道某些常量值,而不必知道其他翻译单元(可能不同时编译,也可能独立更改)

默认情况下,命名空间范围中的
const
变量具有内部链接(即没有显式的
extern
),因此,如果执行类似操作,则不会出现任何多个定义问题

// header.h
const int a = 10;


我不确定我是否了解enum{a=10;}的优点超过
常数int a=10。你能扩展吗?@Charles:你不能可靠地把
const int a=10
在.h文件中-有些编译器可以让您逍遥法外,有些则不行。@Paul R:Ermm,我可以。你的确切意思是什么?@Charles:如果头包含在多个.cpp文件中,则可能会出现链接错误-这取决于编译器/链接器,对于某些编译器,它可能在-O3而不是-O0下工作。同样,为什么会出现链接器错误?您不应该这样做(除非编译器/链接器在某些方面有缺陷)。
// foo.c

#include "foo.h"

int anarray[a];
// header.h
const int a = 10;
// source.cpp
int anarray[a];