3

我在程序中有一个非常简单的文件系统。

有:main.cpp,其中包括worker.h,worker.h和worker.cpp,其中包括worker.h

worker.h 具有 Header 保护并声明了一些 main.cpp 和 worker.cpp 都需要的变量,并且它具有一些函数声明。

#ifndef __WORKER_H_INCLUDED__
#define __WORKER_H_INCLUDED__

    bool x;
    int y;

    void somefunction( int w, int e );

#endif

通过其他一些线程和谷歌结果,我了解到 Header 保护可以保护您免受单个源文件中的多个包含,而不是多个源文件。

所以我可以期待链接器错误。

我的问题是

  1. 为什么只有变量而不是函数有多个定义错误?据我了解,这两者都只在头文件 worker.h 中声明而不定义

  2. 如何在没有多定义链接器错误的情况下使 main.cpp 和 worker.cpp 都可以使用 a 变量?

4

2 回答 2

3

为什么只有变量而不是函数有多个定义错误?据我了解,这两者都只在头文件 worker.h 中声明而不定义

因为你定义了变量。这样他们只被声明:

extern bool x;
extern int y;

但是您必须在 cpp 文件中定义它们。:

bool x = true;
int y = 42;
于 2012-12-03T09:15:11.840 回答
0

的更新答案。随着inline变量的引入,人们不再需要担心需要放置非常量命名空间范围变量的确切翻译单元。撇开关于使用全局变量的讨论,在现代 C++ 中修复 OP 的另一种方法是如下声明变量:

inline bool x; // Can add an initializer here too
inline int y;

只要这是在标头中并且所有 TU 看到相同的确切定义,实现就会解决它并确保这些 TU 都引用完全相同的唯一对象。

于 2019-04-07T08:06:17.273 回答