C++中标题的正确使用

Proper use of header in C++

本文关键字:标题 C++      更新时间:2023-10-16

我在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的全局变量具有内部链接,这意味着每个翻译单元将接收该变量的私有副本。因此,即使变量的定义包含在多个翻译单元中,链接器也不会抱怨多重定义的符号。