【问题标题】:Token pasting does not seem to be working with C++ macros令牌粘贴似乎不适用于 C++ 宏
【发布时间】:2012-02-26 16:48:27
【问题描述】:

我正在尝试使用宏来模仿 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。为什么?

【问题讨论】:

  • 您应该查看预处理器的输出。例如,如果您使用 GCC,则应使用 -E 标志。

标签: c++ macros


【解决方案1】:

##之后的token是t_Node,所以预处理器将List_粘贴到t_Node

要将t 替换为宏参数,它必须是单个标记,然后可以将其粘贴到前面的List_ 和后面的_Node

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

【讨论】:

    【解决方案2】:

    你需要

    List_##t##_Node
          //^^
    

    【讨论】:

    • 谢谢。我会在 8 分钟内接受这个:P 你能解释一下何时需要第二对 # 的规则吗?例如,哪些是有效的? List_##t listList_##t## list
    • @Max:##是一个concat运算符,它会从左到右concat,所以当你需要加入3个东西时,你需要两个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多