起初,我认为我需要这一点,但我最终避免它。然而,我的好奇心(和食欲的知识,哼)让我问:

可以在预处理宏,例如在

#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 ++代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top