在我的项目中,我有多个头文件和源文件。这些文件中的大多数都包含名为settings.h
的头文件
这个文件看起来像这样
#ifndef EXTERNAL_H
#define EXTERNAL_H
#define processID 12
...
#endif // EXTERNAL_H
现在我注意到,如果我将processID从define更改为类型,例如
int processID;
我开始收到链接器错误。我想知道是否有办法让我将processID从define更改为int类型。
答案 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,你会得到一个链接器错误,说明该对象没有被定义。
或者,extern
或const
会将对象缩减为本地范围。