令牌粘贴似乎不适用于C ++宏

时间:2012-02-26 16:48:28

标签: c++ macros

我试图使用宏模仿C ++中的模板行为。例如,如果我想要一个int *列表,那么我会做这样的事情:

typedef int* IntPtr;
List_DEFINE(IntPtr)

请注意,List_DEFINE(IntPtr)没有分号,因为它是一个宏。我已经编写了我的列表“class”(实际上只是几个带有方法指针的结构),并在将其作为宏之前对其进行了测试。我现在正试图“宏观化”我的代码,我遇到了问题。我已经像这样定义了我的宏:

#define List_DEFINE(t) \
struct List_##t_Node { \
...

在上面的例子中,我认为## t将被替换为传入t的内容,但似乎并非如此。如果我定义了两种不同类型的列表,我会收到以下错误:

test.cpp:85: error: redefinition of ‘struct List_t_Node’
test.cpp:75: error: previous definition of ‘struct List_t_Node’

所以在上面的例子中,我希望生成struct List_IntPtr_Node,而是生成List_t_Node。为什么呢?

2 个答案:

答案 0 :(得分:3)

##后的令牌为t_Node,因此预处理程序会将List_粘贴到t_Node

要将t替换为宏参数,必须将其作为单个标记,然后可以将其粘贴到前一个List_并跟随_Node

#define List_DEFINE(t) \
   struct List_ ## t ## _Node { \
   ...

答案 1 :(得分:2)

你需要

List_##t##_Node
      //^^