C 中的计算包含

Ete*_*ent 3 c macros header-files

我正在阅读 gnu.org 上关于计算包含的 C 预处理器指南页面,其中有以下解释:

2.6 计算包含

有时需要从几个不同的头文件中选择一个以包含在您的程序中。例如,它们可能指定要在不同类型的操作系统上使用的配置参数。你可以用一系列条件来做到这一点,

#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3 …
#endif
Run Code Online (Sandbox Code Playgroud)

这很快变得乏味。相反,预处理器提供了对标头名称使用宏的能力。这称为计算包含。而不是写一个标题名称作为 '#include' 的直接参数,你只需在那里放置一个宏名称:

#define SYSTEM_H "system_1.h" 
…
#include SYSTEM_H
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义。第一个代码片段允许通过使用分支 if elifs 根据您遇到的系统类型进行选择。第二个似乎没有可选性,因为宏用于定义特定的系统类型,然后将宏放入 include 语句中,而没有任何暗示其定义可以更改的代码。然而,文本暗示这些是等效的,并且第二个是第一个的简写。谁能解释第一个代码片段的可选性如何存在于第二个代码片段中?我也不知道在第二个代码片段中的“...”中隐含了哪些代码。

Bar*_*mar 5

代码或构建系统中还有一些其他地方定义或不定义在条件中测试的宏。有什么建议的是,而不是那些定义很多不同的地方SYSTEM_1SYSTEM_2等宏,他们就会定义SYSTEM_H到期望的值。

很可能这实际上不会在一个显式中#define,而不是在编译器选项中,例如

gcc -DSYSTEM_H='"system_1.h"' ...
Run Code Online (Sandbox Code Playgroud)

这很可能实际上来自 makefile 或其他配置文件中的设置。