包含多个源文件中包含的"const"的头文件
Header file containing 'const' included in multiple source files
为什么包含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();
}
在C++全局常量是内部链接。将头文件与 cpp 文件组合后(头文件将被"插入"到 #include 所在的 cpp 文件中),每个编译单元将被编译为目标文件,然后链接在一起。这些函数和变量是内部链接,链接器将看不到,这意味着在此阶段看不到您的 const 全局。即使您在不同的对象文件中有两个或更多 const,它们也只是隐藏的。仅对于那些具有外部链接函数和变量的用户,链接器将尝试将声明与定义"组装"。例如:如果你有 extern int a;
在一个编译单元中(插入 .h 的 CPP);链接器将搜索它的定义: int a;
(不带外部关键字)。如果找到两个,则出现重定义错误。
对于常量,它们只是隐藏到链接器中。
因为如果它真的是一个定义而不是一个声明,那么编译器将在一次又一次地遇到定义时创建一个具有相同名称的(全局)变量 - 然后链接器不知道如何处理结果对象代码文件中具有相同名称的多个符号。
可能是因为你写了头文件...但未能包括"标题护卫"。
缺少"标头保护"会导致编译错误。另一种可能性是你没有使用"extern"。 这将导致链接错误。
例如:
#ifndef MY_HEADER_H
#define MY_HEADER_H
extern int myglobal;
#endif
请看以上两个链接。 如果添加防护和/或使用"extern"不能解决问题,请发布失败的代码片段。
相关文章:
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 如何通过头文件中的函数初始化 const int 数组?
- C++ 在头文件或构造函数中初始化 const 类成员变量?
- 将文本文件读取为 const char* 有时有效,有时无效
- 如果在执行过程中替换二进制文件,"const"数组是否驻留在内存中?
- 静态const数据成员在另一个文件中定义
- YAML::LoadFile(std::string const&) 找不到文件 [ROS 中的 yaml-cpp]
- 我可以在类头文件中定义一个类的const静态实例吗
- 在标头文件中使用const
- C++ 中的文件处理错误 - 调用"std::basic_fstream<char, std::char_traits<char> >::open(const char[8],
- 错误:在"boost::文件系统::p ath::文件名() const() + "/""中与"运算符+"不匹配
- 包含多个源文件中包含的"const"的头文件
- 在头文件中声明全局 const 对象
- 默认情况下,const 变量是文件的本地变量
- 为什么在 cpp 文件中定义了非 int const 静态
- 在 MoSync 中将数据写入文件(将 MAUtil::String 转换为 const char*)
- 为什么我可以在多个包含const int的cpp文件中包含一个头文件,而不会出现编译器错误
- 头文件随附的 C++ 文件中的 const 函数
- 头文件中定义的Const float**
- 如何在头文件中定义const-static std::string