定义常量数据库

Ken*_*nta 0 c++ static const

程序#1

// file.h
class File
{
public:
    static const int var = 9;
};
Run Code Online (Sandbox Code Playgroud)

-

// main.cpp
#include <iostream>
#include "file.h"
using namespace std;

int main() {
    File f;
    cout << f.var;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序#2

// file.h
int GlobalVar ;
class File
{
public:
    static const int var = 9;
};
Run Code Online (Sandbox Code Playgroud)

-

// main.cpp
extern int GlobalVar;

#include <iostream>
#include "file.h"
using namespace std;

int main() {
    cout << GlobalVar;
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

程序#1运行正常,但程序#2给出链接器错误:

error LNK2005: "int GlobalVar" (?x@@3HA) already defined in file.obj
Run Code Online (Sandbox Code Playgroud)

我知道头文件永远不会被编译.那么在上面的例子中,编译器如何知道变量var的定义,但是却找不到定义GlobalVar?这两个程序有什么区别?

Kir*_*rov 7

当你使用

#include "some_header.h"
Run Code Online (Sandbox Code Playgroud)

要么

#include <some_header.h>
Run Code Online (Sandbox Code Playgroud)

这些include指令直接由预处理器替换,内容为some_header.h.

因此,在编译cpp文件时,它实际上包含了内容some_header.h.这就是编译这段代码的方法.

* - 如果你有包含警卫,我会被跳过的内容,如果它已经包含在其他标题中


编辑:关于你的编辑 - 关于extern:这不是正确的方法.

extern int GlobalVar ;
Run Code Online (Sandbox Code Playgroud)

应放在标题中,并且

int Globalvar ;
Run Code Online (Sandbox Code Playgroud)

应该在cpp文件中.您应该阅读更多内容extern,了解它是如何工作的以及它做了什么(提示:假设您只想拥有一个变量,在一个地方定义并且可以在多个cpp文件中访问 - 你会怎么做?有很多关于这个案例,SO中的问题也是如此).