代码之家  ›  专栏  ›  技术社区  ›  Nitesh

粘贴形成了无效的处理令牌“.”

  •  12
  • Nitesh  · 技术社区  · 8 年前

    我试图使用宏根据类型调用适当的对象。

    #define DELEGATE_FUNC(FuncName, kind, paramPtr)         \
        if (kind == 1) {                                    \
            return PolicyObject1.##FuncName(paramPtr);      \
        }                                                   \
        else {                                              \
            return PolicyObject2.##FuncName(paramPtr);      \
        }                                                   \
        return 0;                                           \
    

    DELEGATE\u FUNC(ProcessPreCreate,1,null\u ptr);

    它在VS 2015中编译良好,但在LLVM“粘贴形成无效的处理令牌.ProcessPreCreate”时出错

    我找了一些帖子,找到了一些帖子,并且在某种程度上理解了它——需要两个间接层次,例如。 Why do I need double layer of indirection for macros?

    (请撇开设计方面的讨论)

    谢谢

    2 回复  |  直到 8 年前
        1
  •  33
  •   Daniel H    8 年前

    当编译器读取C++文件时,第一步是将其划分为标识符、字符串文字、数字、标点符号等标记。C预处理器处理这些标记 代币 文本 ## 操作员将令牌粘在一起。例如,如果你有

    #define triple(foo) foo##3
    

    triple(x) 将为您获取标识符 x3 triple(12) 将得到整数 123 triple(.) 我会给你拿花车 .3 .

    然而,你拥有的是 .##FuncName FuncName ProcessPreCreate . 这将创建单个令牌 .ProcessPreCreate PolicyObject1.ProcessPreCreate 直接而不是通过宏,它将被标记为三个标记: PolicyObject1 . 进程预创建

    要做到这一点,只需摆脱 . 函数名 . 和成员名称;它仍然可以编译得很好。由于它们是独立的令牌,因此不应该也不能粘合在一起。

        2
  •  4
  •   Nitesh    6 年前

    #define DELEGATE_FUNC(FuncName, kind, paramPtr)     \
    if (kind == 1) {                                    \
        return PolicyObject1.FuncName(paramPtr);        \
    }                                                   \
    else {                                              \
        return PolicyObject2.FuncName(paramPtr);        \
    }                                                   \
    return 0;                                           \