粘贴标记时出现意外的预定义宏行为

时间:2010-08-15 15:33:06

标签: c gcc

以下(使用gcc -E blah.c测试):

#define UNUSED(type) type UNUSED_ ## __COUNTER__
UNUSED(char const *)
UNUSED(int)

生成:

char const * UNUSED__COUNTER__
int UNUSED__COUNTER__

我期待:

char const * UNUSED0
int UNUSED1

我试过调用另一个宏,将括号中的参数包装起来无济于事。 如果我不粘贴令牌,它似乎工作正常。 documentation特别提到在标记粘贴中使用__COUNTER__

我做错了什么?

3 个答案:

答案 0 :(得分:1)

__COUNTER__仅在GCC 4.3中引入 - 如果您碰巧使用的是早期版本,则根本没有定义宏。在这种情况下,Boost.PPs BOOST_PP_COUNTER宏可能值得研究。

在较新的GCC版本上,您仍然需要一种不同的连接方法,因为##会阻止其参数扩展。因此,在使用##

之前,必须先将它们展开
#define CAT(a, b) CAT_I(a, b)
#define CAT_I(a, b) CAT_II(a ## b)
#define CAT_II(x) x
#define UNUSED(type) type CAT(UNUSED_, __COUNTER__)

如果您已经在使用Boost,BOOST_PP_CAT()会为您提供相同的功能。

答案 1 :(得分:1)

尝试使用gcc 4.4,这可行:

#define UNUSED(type) UNUSED_(type, __COUNTER__)
#define UNUSED_(type, counter) UNUSED__(type, counter)
#define UNUSED__(type, counter) type UNUSED_ ## counter
UNUSED(char const *)
UNUSED(int)

但如果我拿出一级中间体,它就不起作用。

答案 2 :(得分:-1)

我相信你必须“加倍扩展”它:

#define STR(x)    #x
#define UNUSED(type) type UNUSED_ ## STR(__COUNTER__)
UNUSED(char const *) 
UNUSED(int)