为什么不包含const
定义且多个源文件包含的头文件会导致multiple definition
出现编译错误?
const_in_header_file.h
const int num = 5;
//int x; //Error. Multiple defintion if included from multiple source files.
const_in_header_file_func.cpp
#include <iostream>
#include "const_in_header_file.h"
using namespace std;
void func(void)
{
cout << "num in func() = " << num << endl;
}
const_in_header_file_main.cpp
#include <iostream>
#include "const_in_header_file.h"
using namespace std;
extern void func(void);
int main()
{
cout << "num in main() = " << num << endl;
func();
}
答案 0 :(得分:2)
在C ++中,全局const是内部链接。将头文件与cpp文件组合(头文件将“插入”到#include所在的cpp文件中)后,每个编译单元将被编译为目标文件,然后链接在一起。链接器不会看到那些函数和变量是内部链接,这意味着在这个阶段不会看到你的const全局。即使您在不同的目标文件中有两个或更多const,它们也只是隐藏。
只有具有外部链接函数和变量的那些,链接器才会尝试使用定义“组合”声明。
例如:
如果你有
extern int a;
在一个编译单元中(插入.h的cpp);
链接器将搜索它的定义:
int a;
(没有外部关键字)。
如果找到两个,则会出现重新定义错误。
对于常量,它们只对链接器隐藏。
答案 1 :(得分:0)
因为如果它确实是定义而不是声明,那么只要它一次又一次地遇到它,编译器就会创建一个具有相同名称的(全局)变量。定义 - 然后链接器不知道如何处理生成的目标代码文件中具有相同名称的多个符号。
答案 2 :(得分:-1)
可能是因为您编写了头文件...但未能包含“header guards"。
缺少“标题保护”会导致编译错误。另一种可能是你没有使用“extern”。这会导致链接错误。
例如:
#ifndef MY_HEADER_H
#define MY_HEADER_H
extern int myglobal;
#endif
请看以上两个链接。如果添加警卫和/或使用“extern”不能解决问题,请发布一段代码失败的代码。