3

为什么包含 a 的定义并被多个源文件包含的头文件给出编译错误?constmultiple 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();
}
4

3 回答 3

3

在 C++ 中,全局 const 是内部链接。将头文件与 cpp 文件合并后(头文件将“插入”到 #include 所在的 cpp 文件中),每个编译单元将被编译为目标文件,然后链接在一起。那些是内部链接的函数和变量不会被链接器看到,这意味着在这个阶段你的 const global 不会被看到。即使您在不同的目标文件中有两个或多个 const,它们也只是隐藏的。只有那些具有外部链接函数和变量的链接器才会尝试将声明与定义“组装”起来。例如:如果您有 extern int a;一个编译单元(插入 .h 的 cpp);链接器将搜索它的定义:( int a;没有外部关键字)。如果找到两个,就会出现重新定义错误。

对于常量,它们只是对链接器隐藏。

于 2012-08-16T04:59:58.133 回答
0

因为如果它真的是一个定义而不是一个声明,那么编译器将在它一次又一次遇到定义时创建一个具有相同名称的(全局)变量 - 然后链接器不知道如何处理多个符号在生成的目标代码文件中具有相同的名称。

于 2012-08-16T04:40:47.843 回答
-1

可能是因为您编写了头文件……但未能包含“头文件保护”

缺少“标头保护”会导致编译错误。另一种可能是您没有使用“ extern ”。这会导致链接错误。

例如:

#ifndef MY_HEADER_H
#define MY_HEADER_H

extern int myglobal;

#endif

请看上面的两个链接。如果添加防护和/或使用“extern”不能解决问题,请发布失败的代码片段。

于 2012-08-16T04:41:00.867 回答