包含头文件错误:多个定义

时间:2012-12-03 09:09:11

标签: c++

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

有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提供变量?

2 个答案:

答案 0 :(得分:3)

  

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

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

extern bool x;
extern int y;

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

bool x = true;
int y = 42;

答案 1 :(得分:0)

的更新答案。随着inline变量的引入,人们不再需要担心需要放置非const名称空间范围的变量的确切转换单元。除了一般性地讨论使用全局变量的讨论外,另一种在现代C ++中修复OP的方法是声明变量,如下所示:

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

只要这在标头中并且所有TU都具有相同的确切定义,实现将对其进行解析,并确保这些TU都引用完全相同的唯一对象。