宏串联和进一步扩展
我可以放心地期望它
#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)
在任何合理标准的 C 预处理器上生成吗
template < >
template < typename Arg0 >
template < typename Arg0 , typename Arg1 >
template < typename Arg0 , typename Arg1 , typename Arg2 >
?
我担心的是先前替换后串联后的宏扩展:它是否有效,以便在 N 被替换后例如被 2 然后
TEMPLATE_DECL_BEGIN_2
变成
TEMPLATE_DECL_BEGIN_1 , typename Arg1
?
Can I safely expect this
#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)
to generate
template < >
template < typename Arg0 >
template < typename Arg0 , typename Arg1 >
template < typename Arg0 , typename Arg1 , typename Arg2 >
on any reasonably standard C preprocessor?
My worry is about macro expansion after concatenation after previous replacement: does it work so that after N gets replaced for example by 2 then
TEMPLATE_DECL_BEGIN_2
becomes
TEMPLATE_DECL_BEGIN_1 , typename Arg1
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的。来自 C99 标准的 6.10.3.3§3:
和 6.10.3.4§3 :
该标准保证
x ## y
在替换更多宏名称之前发生,因此如果您当时构造一个宏名称,它将被替换。这是来自 C99 标准,但我非常怀疑他们从 C89 标准更改了这一部分,这将是真正适用于 C++ 的版本。
Yes. From 6.10.3.3§3 of the C99 standard:
And 6.10.3.4§3 :
The standard guarantees that
x ## y
happens before replacing more macro names, so if you construct a macro name at that time, it will be replaced.This is from the C99 standard, but I highly doubt they changed this secion from the C89 standard, which would be the version that really applies to C++.