令牌粘贴似乎不适用于C++宏 我试图用宏模拟C++中的模板行为。例如,如果我想要一个int*列表,那么我会这样做: typedef int* IntPtr; List_DEFINE(IntPtr) #define List_DEFINE(t) \ struct List_##t_Node { \ ...

令牌粘贴似乎不适用于C++宏 我试图用宏模拟C++中的模板行为。例如,如果我想要一个int*列表,那么我会这样做: typedef int* IntPtr; List_DEFINE(IntPtr) #define List_DEFINE(t) \ struct List_##t_Node { \ ...,c++,macros,C++,Macros,请注意,List_defineintpr没有分号,因为它是一个宏。我已经编写了我的list类,实际上只是几个带方法指针的结构,并在将其变成宏之前对其进行了测试。我现在正试图宏化我的代码,我遇到了问题。我对宏的定义如下: typedef int* IntPtr; List_DEFINE(IntPtr) #define List_DEFINE(t) \ struct List_##t_Node { \ ... 在上面的例子中,我认为t将被传递到t中的任何东西所取代,但事实似乎并非如此。如果定义两

请注意,List_defineintpr没有分号,因为它是一个宏。我已经编写了我的list类,实际上只是几个带方法指针的结构,并在将其变成宏之前对其进行了测试。我现在正试图宏化我的代码,我遇到了问题。我对宏的定义如下:

typedef int* IntPtr;
List_DEFINE(IntPtr)
#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_节点,而不是生成List_t_节点。为什么?

你需要

List_##t##_Node
      //^^
你需要

List_##t##_Node
      //^^
后面的标记是t_节点,因此预处理器将List_u粘贴到t_节点

要将t替换为宏参数,它必须是单个标记,然后可以将其粘贴到前面的列表和下面的节点:

后面的标记是t_节点,因此预处理器将List_u粘贴到t_节点

要将t替换为宏参数,它必须是单个标记,然后可以将其粘贴到前面的列表和下面的节点:


您应该查看预处理器的输出。例如,如果您使用的是GCC,那么应该使用-E标志,您应该查看预处理器的输出。例如,如果您使用的是GCC,那么应该使用-E标志。谢谢。我会在8分钟内接受:P你能解释一下什么时候需要第二对的规则吗。例如,以下哪项是有效的?列表list@Max:是一个concat操作符,它将从左到右concat,因此当您需要连接3个东西时,就是您需要两个的时候。我会在8分钟内接受:P你能解释一下什么时候需要第二对的规则吗。例如,以下哪项是有效的?列表list@Max:是一个concat操作符,它将从左到右concat,因此当您需要连接3个对象时,就是需要两个对象时