我试图使用宏模仿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。为什么呢?
答案 0 :(得分:3)
##
后的令牌为t_Node
,因此预处理程序会将List_
粘贴到t_Node
。
要将t
替换为宏参数,必须将其作为单个标记,然后可以将其粘贴到前一个List_
并跟随_Node
:
#define List_DEFINE(t) \
struct List_ ## t ## _Node { \
...
答案 1 :(得分:2)
你需要
List_##t##_Node
//^^