假设我创建了一个头文件constants.h,该文件包含:
extern const int YEAR = 2011; // definition
如果我在cpp文件(MainCPP.cpp)中尝试使用此常量后声明它而不定义它并且不包括constants.h文件如下:
extern const int YEAR; // declaration
int main() {
cout << YEAR << endl;
}
当我尝试这样做时,我得到:未解析的外部符号“int const YEAR”。另一方面,如果我将YEAR的定义放在constant.cpp文件中并在MainCpp.cpp中完成相同的操作,我将不会得到错误,链接器将能够与constants.cpp中定义的YEAR链接(不包括这里也是MainCpp.cpp中的constants.cpp。)
这是否意味着链接器可以与源文件代码链接,但不能与头文件代码链接,除非您明确包含头文件。
答案 0 :(得分:3)
头文件中的声明应该是声明,而不是定义。换句话说,不要在标题中加上“= 2011”。
需要在某处定义此变量,例如main.cpp。不要将extern
放在该定义中。
最后,如果要在运行时为变量赋值,则不能使用const
限定符声明它。
答案 1 :(得分:0)
extern
告诉编译器在其他地方为其分配了空间。在某个地方必须有一个定义,没有外部。但是在C ++中(与C不同),consts有内部链接,因此你不需要extern。 (见Why does const imply internal linkage in C++, when it doesn't in C?)
只需将const int YEAR = 2011;
放入您的标题文件中,并将您的标题文件包含在您需要的位置。