访问公共头文件的多个源文件和头文件

时间:2016-03-11 20:05:03

标签: c++ c++11

在我的项目中,我有多个头文件和源文件。这些文件中的大多数都包含名为settings.h的头文件 这个文件看起来像这样

#ifndef EXTERNAL_H
#define EXTERNAL_H

#define processID 12
...
#endif // EXTERNAL_H

现在我注意到,如果我将processID从define更改为类型,例如

int processID;

我开始收到链接器错误。我想知道是否有办法让我将processID从define更改为int类型。

3 个答案:

答案 0 :(得分:2)

链接器错误由以下事实给出:在包含该标头的每个源文件中生成具有相同名称的符号。

所以解决这个问题你有多种选择,但C ++ 11中应该有一个方法,那就是constexpr说明符:

constexpr int processID = 12;

另一个解决方案是使用static说明符,但这将在每个源中创建一个具有相同名称的不同变量,仅防止冲突,因为每个符号都隐藏在每个源中。

第三个解决方案是使用const int,因为无法修改const值,无论在每个源文件中生成多少个值,它们都将解析为相同的值

答案 1 :(得分:1)

  

我想知道是否有办法让我将processID从define更改为int类型。

最简单的方法是将其转换为const声明:

const int processID = 12;

答案 2 :(得分:1)

您需要在标题中使用extern int processID;,但是您需要在一个的源文件中编写int processID = 12; - 这是因为{{1 }} keyword指定实际对象存在于其他位置,它没有定义它。如果你没有在源文件中声明int,你会得到一个链接器错误,说明该对象没有被定义。

或者,externconst会将对象缩减为本地范围。