Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包含';常数';包含在多个源文件中_C++_Constants - Fatal编程技术网

C++ 包含';常数';包含在多个源文件中

C++ 包含';常数';包含在多个源文件中,c++,constants,C++,Constants,为什么包含常量定义且包含在多个源文件中的头文件不会给多定义带来编译错误 头文件.h中的常量 const int num = 5; //int x; //Error. Multiple defintion if included from multiple source files. 头文件中的常量\u func.cpp #include <iostream> #include "const_in_header_file.h" using namespace std; void

为什么包含
常量定义且包含在多个源文件中的头文件不会给
多定义
带来编译错误

头文件.h中的常量

const int num = 5;
//int x; //Error. Multiple defintion if included from multiple source files.
头文件中的常量\u func.cpp

#include <iostream>
#include "const_in_header_file.h"

using namespace std;

void func(void)
{
   cout << "num in func() = " << num << endl;
}
#include <iostream>
#include "const_in_header_file.h"

using namespace std;
extern void func(void);

int main()
{
   cout << "num in main() = " << num << endl;
   func();
}
#包括
#包括“const_in_header_file.h”
使用名称空间std;
无效函数(无效)
{

cout因为如果它真的是一个定义而不是一个声明,那么编译器将创建一个(全局)每当变量一次又一次地遇到定义时,它都会使用相同的名称-然后链接器不知道如何处理结果对象代码文件中具有相同名称的多个符号。

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

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

例如:

#ifndef MY_HEADER_H
#define MY_HEADER_H

extern int myglobal;

#endif

请查看上面两个链接。如果添加了一个保护和/或使用“Extn”,则请发布一个失败的代码片段。在C++全局CONST中,

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


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

您能准确地显示声明的外观,包括所有相关类型吗?@GregHewgill可能根本不需要:)可能的确如此。显示实际代码总是有帮助的。您需要显示代码以获得直接答案。在某些情况下,在某些范围内,头部中的定义R可能存在于合法的,并且可以在多个TUs上可见,但是C++中有很多的变化。在C++中,有多种方法来修复这个问题,但这又取决于类型和范围。SRRYY。我的错误。我实际上是指“代码>不< /COD>。但是在网络注解之前,不能更新,在答案被灌输之前。正如你所说:“缺少头保护将导致编译器错误…”-但不是链接器错误,正如OP所写(因为如果编译错误消失,链接甚至不会启动)。猜猜:因为
const
变量默认有内部链接?@CharlesBailey谢谢!(但我猜你没有否决投票。)然而,这里不应该是这种情况-多重派生错误是由具有外部链接的重复符号引起的。或者我缺少关于静态链接的一些信息。或者OP编译器的错误。编译错误“多重定义”"表示该对象已在翻译单元中定义多次,因此对象的链接无关紧要。@CharlesBailey真的吗?然后尝试将包含相同函数的两个对象文件链接在一起。我不明白你的上一条注释与我的注释有何关联。如果我的翻译单元编译失败,我就不会有ob首先,将文件链接到链接,这就是为什么我说链接是无关紧要的。