预处理器宏扩展到另一个的预处理器指令
-
12-09-2019 - |
题
起初,我认为我需要这一点,但我最终避免它。然而,我的好奇心(和食欲的知识,哼)让我问:
可以在预处理宏,例如在
#include "MyClass.h"
INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)
扩展到另一个包括,就像
#include "MyClass.h"
#include "FooTemplate.h"
template class FooTemplate<MyClass>;
?
解决方案
相信不能做,这是因为预处理器是的单次即可。因此它不能发射其他预处理指令。
具体而言,从C99标准(6.10.3.4段落3):
3完全将所得 宏替换的预处理标记 序列不被处理作为 预处理指令即使 类似于一个,...
有趣的是,这就是为什么一元_Pragma
操作者加入到C99。因为#pragma
不能由宏来emited,但_Pragma
即可。
其他提示
C标准说,这大约预处理指令(C99 - 6.10(2) - 预处理指令):
一个预处理指令由以开始预处理标记的序列的 一个#预处理令牌(在翻译阶段开始4) ...
和(C99 - 6.10(7)):
预处理指令内的预处理标记不受宏 膨胀,除非另有说明。
实施例在:
#define EMPTY EMPTY # include <file.h>
在第二行预处理标记的序列是不是一个预处理指令,因为它不带有#在翻译阶段4的开始开始,尽管它会这么做宏EMPTY更换后
所以,不,宏不能扩展到了“#include
”预处理指令。这些指令需要在发生在翻译阶段4的开始(处理这些指令时发生预处理发生)。由于宏膨胀阶段4期间发生,宏不能引起的东西在阶段4的开始存在。
我想然而要指出的是,以下的确实强>工作:
#ifdef WIN32
#define PLATFORM_HEADER "platform/windows/platform.h"
#else
#define PLATFORM_HEADER "platform/linux/platform.h"
#include PLATFORM_HEADER
因为C标准说这个(C99,6.10.2(4) - 资源文件包含):
形式的预处理指令
# include pp-tokens new-line
(不匹配的先前的两个形式中的一种)是允许的。预处理 令牌包括在指令之后进行处理,就像在普通文本。 (每 目前定义为宏名称标识符是由它的替换列表所替换 预处理标记。)
所有预处理器指令被解释宏扩展开始之前,所以没有,则可以不具有宏膨胀成#include指令并将它被解释为这样的。相反,它将被解释为(错误)C ++代码。