如何以及在何处定义预处理器指令,以便我们可以在项目中的任何地方访问它们?
How and where to define pre-processor directives such that they are accessible wherever we want in the project?
这里的意图是当程序启动时,一个特定的函数将读取一个配置文件并设置一些#define
。在这个项目的其他部分,这些预处理器指令将决定执行什么代码,不执行什么代码。
示例:
文件 X 包含:
#define WHAT 0
文件 Y 包含:
#if (WHAT)
// Do this
应该如何以及在哪里组织这些类型的 #define
,以便在不造成混乱的情况下访问它们应该在的地方?
预处理器指令是在程序编译时解析的,而不是在程序启动时解析的,因此您要求的无法完成。
您需要一种运行时机制才能使其正常工作,但这并不能保证从已编译的二进制文件中排除代码。
The intention here is that when the program starts, a particular
function will read a configuration file and set some #defines. In
other parts of this project, these preprocessor directives will decide
what code to execute and what not.
正如另一个答案所说,这是不可能的,因为像 #define
这样的预处理器指令被编译器预处理器使用了。您的可执行二进制文件实际看到的是编译后的修改后的源代码,无论您每次 运行 打开不同的文件,它都保持不变。此外,没有像加载配置文件和更改 运行 时间这样的概念,因为 C++ 是一种编译语言而不是解释语言。
实际上有可能
- 加载配置文件(最好是stand格式)
- 使用公开可用的标准格式库对其进行解析,或者编写您自己的解析器。
- 使用 map 等 STL 对象创建配置键和值之间的映射
- 将STL放在一些命名空间中,以免污染全局命名空间并使其成为extern。确保头文件中存在 extern 声明并且变量在 .cpp 文件中定义,以便可以从与其定义位置不同的翻译单元访问变量。
- 在程序中的任何位置使用映射的配置。
这里的意图是当程序启动时,一个特定的函数将读取一个配置文件并设置一些#define
。在这个项目的其他部分,这些预处理器指令将决定执行什么代码,不执行什么代码。
示例:
文件 X 包含:
#define WHAT 0
文件 Y 包含:
#if (WHAT)
// Do this
应该如何以及在哪里组织这些类型的 #define
,以便在不造成混乱的情况下访问它们应该在的地方?
预处理器指令是在程序编译时解析的,而不是在程序启动时解析的,因此您要求的无法完成。
您需要一种运行时机制才能使其正常工作,但这并不能保证从已编译的二进制文件中排除代码。
The intention here is that when the program starts, a particular function will read a configuration file and set some #defines. In other parts of this project, these preprocessor directives will decide what code to execute and what not.
正如另一个答案所说,这是不可能的,因为像 #define
这样的预处理器指令被编译器预处理器使用了。您的可执行二进制文件实际看到的是编译后的修改后的源代码,无论您每次 运行 打开不同的文件,它都保持不变。此外,没有像加载配置文件和更改 运行 时间这样的概念,因为 C++ 是一种编译语言而不是解释语言。
实际上有可能
- 加载配置文件(最好是stand格式)
- 使用公开可用的标准格式库对其进行解析,或者编写您自己的解析器。
- 使用 map 等 STL 对象创建配置键和值之间的映射
- 将STL放在一些命名空间中,以免污染全局命名空间并使其成为extern。确保头文件中存在 extern 声明并且变量在 .cpp 文件中定义,以便可以从与其定义位置不同的翻译单元访问变量。
- 在程序中的任何位置使用映射的配置。