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

C 粘贴标记时出现意外的预定义宏行为,c,gcc,C,Gcc,以下内容(使用gcc-E blah.c进行测试): 生成: char const * UNUSED__COUNTER__ int UNUSED__COUNTER__ 我期待着: char const * UNUSED0 int UNUSED1 我尝试调用另一个宏,将参数用括号括起来,但没有效果。 如果我不粘贴代币,它似乎可以正常工作。 特别提到了在令牌粘贴中使用\uuuuuuu计数器 我做错了什么?我相信你必须“加倍扩展”它: 我相信你必须“加倍扩展”它: \uuuu计数器\uuuu仅在中介

以下内容(使用
gcc-E blah.c
进行测试):

生成:

char const * UNUSED__COUNTER__
int UNUSED__COUNTER__
我期待着:

char const * UNUSED0
int UNUSED1
我尝试调用另一个宏,将参数用括号括起来,但没有效果。 如果我不粘贴代币,它似乎可以正常工作。 特别提到了在令牌粘贴中使用
\uuuuuuu计数器

我做错了什么?

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

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


\uuuu计数器\uuuu
仅在中介绍-如果您碰巧使用了早期版本,则不会定义宏。在这种情况下,
BOOST\u PP\u计数器
宏可能值得研究

在较新的GCC版本上,您仍然需要一种不同的连接方法,因为
##
阻止其参数扩展。因此,在使用
##
之前,必须先展开它们:


如果您已经在使用Boost,
Boost\u PP\u CAT()
为您提供了相同的功能。

\uuuu COUNTER\uuu
仅在中介绍过-如果您碰巧使用了早期版本,则根本不定义宏。在这种情况下,
BOOST\u PP\u计数器
宏可能值得研究

在较新的GCC版本上,您仍然需要一种不同的连接方法,因为
##
阻止其参数扩展。因此,在使用
##
之前,必须先展开它们:


如果您已经在使用Boost,
Boost\u PP\u CAT()
为您提供了相同的功能。

在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)

但是,如果我只取一级中间产物,它就不起作用了。

在GCC4.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)

但是如果我去掉一个级别的中间产物,它就不起作用。

这一点运气不好:
char-const*UNUSED\u-STR(0)
int-UNUSED\u-STR(1)
UNUSED\u-STR之后的空格是问题吗?你肯定不是有意要字符串化,是吗?如果这一切都起作用,它会产生像
char-const*UNUSED“0”
…这样的结果就不走运了:
char-const*UNUSED\u-STR(0)
int-UNUSED\u-STR(1)
是UNUSED\u之后的空格。这个问题?你肯定不是有意要字符串化,是吗?如果这是可行的,它会产生诸如“代码> char const *未使用的”0”<代码>……对不起,C++标签是不正确的,所以将CPP更改为C++…显然有人没听说过Cpreprocessor@Matt答案是C和C++相同,甚至Boost.PP都用。我的意思是C++的ISM,比如Boost在这里没有用。但是谢谢你的信息。对不起,C++标签不正确,所以将CPP更改为C++。显然有人没听说过Cpreprocessor@Matt答案是C和C++相同,甚至Boost.PP都用。我的意思是C++的ISM,比如Boost在这里没有用。但是谢谢你提供的信息。
#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__)
#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)