繁体   English   中英

宏串联和进一步扩展

[英]Macro concatenation and further expansion

我可以安全地期待这个吗

#define TEMPLATE_DECL_BEGIN_0 template <
#define TEMPLATE_DECL_BEGIN_1 TEMPLATE_DECL_BEGIN_0 typename Arg0
#define TEMPLATE_DECL_BEGIN_2 TEMPLATE_DECL_BEGIN_1 , typename Arg1
#define TEMPLATE_DECL_BEGIN_3 TEMPLATE_DECL_BEGIN_2 , typename Arg2
#define TEMPLATE_DECL(N) TEMPLATE_DECL_BEGIN_ ## N >

TEMPLATE_DECL(0)
TEMPLATE_DECL(1)
TEMPLATE_DECL(2)
TEMPLATE_DECL(3)

产生

template < >
template < typename Arg0 >
template < typename Arg0 , typename Arg1 >
template < typename Arg0 , typename Arg1 , typename Arg2 >

在任何合理的标准C预处理器上?

我担心的是在先前替换之后的级联之后的宏扩展:它是否起作用,以便例如在N被替换为2之后

TEMPLATE_DECL_BEGIN_2

TEMPLATE_DECL_BEGIN_1 , typename Arg1

是。 根据C99标准的6.10.3.3§3:

对于类对象和类函数宏调用,在重新检查替换列表以查找更多要替换的宏名称之前,删除替换列表中的##预处理令牌的每个实例(而不是从参数中删除),并且前面的预处理令牌与以下预处理令牌连接。

和6.10.3.4§3:

在替换列表中的所有参数都已被替换并且#和##处理已经完成之后,所有地标预处理令牌都将被删除。 然后,对生成的预处理令牌序列以及源文件的所有后续预处理令牌进行重新扫描,以替换更多的宏名称。

该标准保证x ## y在替换更多的宏名称之前发生,因此,如果在那时构造一个宏名称,它将被替换。

这是来自C99标准的,但是我非常怀疑他们是否从C89标准更改了此部分,而C89标准才是真正适用于C ++的版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM