我在程序中有一个非常简单的文件系统。
有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防护可以保护您免受单个源文件中的多个包含,而不是来自多个源文件。
所以我可以期待链接器错误。
我的问题是
为什么只有变量而不是函数有多个定义错误?据我所知,这两个仅在头文件worker.h中声明并且未定义
如何在没有多重定义链接器错误的情况下为main.cpp和worker.cpp提供变量?
答案 0 :(得分:3)
为什么只有变量而不是函数存在多个定义错误?据我所知,这两个都只是在头文件worker.h中声明和定义,
因为您定义了变量。这样他们只被声明:
extern bool x;
extern int y;
但是你必须在cpp文件中定义它们。 :
bool x = true;
int y = 42;
答案 1 :(得分:0)
c++17的更新答案。随着inline
变量的引入,人们不再需要担心需要放置非const名称空间范围的变量的确切转换单元。除了一般性地讨论使用全局变量的讨论外,另一种在现代C ++中修复OP的方法是声明变量,如下所示:
inline bool x; // Can add an initializer here too
inline int y;
只要这在标头中并且所有TU都具有相同的确切定义,实现将对其进行解析,并确保这些TU都引用完全相同的唯一对象。