我正在尝试使用宏来模仿 C++ 中的模板行为。例如,如果我想要一个 int* 列表,那么我会这样做:
typedef int* IntPtr;
List_DEFINE(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_Node,但生成的是 List_t_Node。为什么?
最佳答案
##
之后的标记是t_Node
,所以预处理器将List_
粘贴到t_Node
。
要将 t
替换为宏参数,它必须是单个标记,然后可以将其粘贴到前面的 List_
和后面的 _Node
:
#define List_DEFINE(t) \
struct List_ ## t ## _Node { \
...
关于c++ - token 粘贴似乎不适用于 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9454973/