C++中标题的正确使用
Proper use of header in C++
我在C++中玩多个文件,我想出了以下不编译的例子:
main.cpp
#include <iostream>
#include "const.hpp"
using namespace std;
int main()
{
extern double var;
var = 5;
cout << var << endl;
return 0;
}
fct.cpp
#include <iostream>
#include "const.hpp"
using namespace std;
void func()
{
extern double var;
cout << var << endl;
}
const.hpp
#ifndef CONST_H
#define CONST_H
double var;
#endif
我的程序没有编译,因为显然有一个变量的多定义。我是否正确地假设,基于这个例子,头文件是,而不是,用于声明变量,就像我上面的例子一样?
相反,正确的过程是在.cpp文件中声明所有变量,并使用标头告诉每个(相关(翻译单元.cpp文件包含外部(external(变量?
编辑:对我上面规则的解释是在处理常量变量(const(时正确吗?常量变量应该在头中定义?
double var;
是一个定义-在多个文件中包含该标头将违反一个定义规则。如果您想要一个全局(请三思(,则必须在标头-extern double var;
中声明,并将定义移动到单个实现文件中。
基于这个例子,我假设头文件不打算像上面的例子那样用于声明变量,这是正确的吗?
头文件用于声明变量,但您的头文件定义了一个具有外部链接的全局变量,并且它被多次导入。然后,链接器合理地抱怨多重定义的符号。
相反,正确的过程是在.cpp文件中声明所有变量,并使用标头告诉每个(相关(翻译单元.cpp文件包含外部(extern(变量?
是的,只是您不会声明该.cpp
文件中的全局变量,而是为它们提供定义。
const.hpp
#ifndef CONST_H
#define CONST_H
// ...
extern double var;
// ^^^^^^
#endif
globals.cpp
(可以是任何其他.cpp
文件,只要它只有一个(
// ...
double var;
此外,如果您想知道在这种情况下,您的防护罩无法保护您的原因,这可能会对您有所帮助。
我上面的规则的一个例外是在处理常量变量(const(时,它应该在头中定义,这正确吗?
从某种意义上说,是的。默认情况下,限定为const
的全局变量具有内部链接,这意味着每个翻译单元将接收该变量的私有副本。因此,即使变量的定义包含在多个翻译单元中,链接器也不会抱怨多重定义的符号。
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 对于C++,方括号中的标题必须总是在引号中的标题之上吗
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 为什么我不应该把所有东西都放在标题中?
- WinAPI 检查窗口是否具有常规标题栏
- 如何更改窗体上所有控件的标题?[C++生成器]
- 提升用于解析标题列的精神语法
- 所以我正在为我的学校作业练习继承,但我无法正确实施标题保护
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 使用类 ?C++ 和 SFML 以及标题中的 15 个字符
- Gtkmm 窗口为空白,不显示任何小部件或标题
- 我将如何在 cpp 中生成一个随机且独特的标题
- std::带有颜色和标题的 clog 包装器无法正确打印整数
- 仅提升计时标题与链接
- 是否有理由在标题中保留完全专用的模板?
- 如何在QGroundControl的标题中放置空格?
- 崇高的林特与叮当在标题中找不到头文件
- C++ - 从 MFC 应用程序启动记事本,并将其默认标题从 "Untitled - Notepad" 更改为其他内容
- 无法在 GLFW 窗口标题中显示'ä'
- 只要我不包含一个标题,重新定义C++关键字合法吗