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

C++ 访问公共头文件的多个源文件和头文件,c++,c++11,C++,C++11,在我的项目中,我有多个头文件和源文件。大多数文件都包含名为settings.h 这个文件看起来像这样 #ifndef EXTERNAL_H #define EXTERNAL_H #define processID 12 ... #endif // EXTERNAL_H 现在我注意到,如果我将processID从define更改为如下类型 int processID; 我开始得到链接器错误。我想知道是否有办法将processID从define更改为int类型。链接器错误是因为在包含该头的每个

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

#ifndef EXTERNAL_H
#define EXTERNAL_H

#define processID 12
...
#endif // EXTERNAL_H
现在我注意到,如果我将processID从define更改为如下类型

int processID;

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

链接器错误是因为在包含该头的每个源文件中生成了同名的符号

所以要解决这个问题,您有多种选择,但C++11中应该有一种,即
constepr
说明符:

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


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

链接器错误是由于在包含该头的每个源文件中生成具有相同名称的符号

所以要解决这个问题,您有多种选择,但C++11中应该有一种,即
constepr
说明符:

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

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

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

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

const int processID = 12;
我想知道是否有办法将processID从define类型更改为int类型

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

const int processID = 12;

您需要使用
extern int processID在标题中,但是您需要写入
intprocessid=12在一个源文件中-这是因为
extern
关键字指定实际对象存在于其他地方,而不是定义它。如果未在源文件中声明int,则会出现链接器错误,表示未定义对象


或者,
const
constexpr
将对象缩小到局部范围。

您需要使用
extern int processID在标题中,但是您需要写入
intprocessid=12在一个源文件中-这是因为
extern
关键字指定实际对象存在于其他地方,而不是定义它。如果未在源文件中声明int,则会出现链接器错误,表示未定义对象


可选的,<代码> const 或 CONTXPRPR 将对象缩小到局部范围。

@ YAKK:是的,它是有效的,但我认为它是一个黑客,因为<代码> EnUM <代码>意在表示一组有限的可能值,在这种情况下情况并非如此。事实上,我从C++ 11到现在都不使用<代码> EnUM <代码> >代码> >枚举类< /COD>。这避免了问题。@ YAKK:是的,它是有效的,但我认为它是一个黑客,因为<代码>枚举> /COD>是表示一组有限的可能值,而在这种情况下情况并非如此。事实上,自从C++11以来,我甚至不再使用
enum
,而是使用
enum类
,这样就避免了这个问题。