粘贴形成了无效的处理令牌"."
Pasting formed an invalid processing token '.'
我试图根据类型调用宏来调用适当的对象。
#define DELEGATE_FUNC(FuncName, kind, paramPtr)
if (kind == 1) {
return PolicyObject1.##FuncName(paramPtr);
}
else {
return PolicyObject2.##FuncName(paramPtr);
}
return 0;
(PolicyObject1& PolicyObject2是两个静态对象。)现在使用宏,例如
delegate_func(processPrecreate,1,null_ptr);
它在vs 2015中编译了罚款,但使用llvm"粘贴形成无效的处理令牌"。
我寻找并找到了一些帖子,并将其理解到一定层次 - 需要双向间接级别,例如为什么我需要宏的间接两层?
但是我无法定义这两层宏,谁能帮忙?
(请在设计方面搁置讨论)
谢谢
编译器读取您的C 文件时,第一步之一就是将其分为标识符,字符串字符串,数字,标点等等令牌。C预处理程序对这些进行工作。令牌,而不是文本。##
操作员胶合物将其粘合在一起。因此,例如,如果您有
#define triple(foo) foo##3
然后triple(x)
将为您提供标识符x3
,triple(12)
将为您提供整数123
,并且triple(.)
将为您提供float .3
。
但是,您拥有的是.##FuncName
,其中FuncName
为ProcessPreCreate
。这创建了单个令牌.ProcessPreCreate
,这不是有效的C 令牌。如果您直接通过宏直接键入PolicyObject1.ProcessPreCreate
,则将其归为三个令牌:PolicyObject1
,.
和ProcessPreCreate
。这是您的宏需要生产的才能提供有效的C 输出。
这样做,只需摆脱##
即可。没有必要将.
粘贴到FuncName
,因为它们是单独的令牌。要检查此问题,您可以在.
和成员名称之间放置一个空间;它仍然可以编译好。由于它们是独立的令牌,因此它们不应也不应该粘合在一起。
删除" ##"。
#define DELEGATE_FUNC(FuncName, kind, paramPtr)
if (kind == 1) {
return PolicyObject1.FuncName(paramPtr);
}
else {
return PolicyObject2.FuncName(paramPtr);
}
return 0;
- 如何在C++中使用X509证书模在令牌中查找私钥
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- Arduino 用于语句错误。令牌之前的预期')' ';'。如何解决这个问题?
- 错误:令牌 { '{' 之前应存在非限定 ID
- 允许哪些令牌作为 #include 的参数?
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 它在 { 令牌之前给了我预期的标识符
- (错误:令牌之前'<<'预期的主表达式)
- 为什么 ## aka 令牌粘贴运算符不适用于 C 和 C++ 中的注释?
- 错误:"->"令牌之前的预期初始值设定项
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 丢失读入的每一行输入中的最后一个令牌
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 插入protobuf时SQLite无法识别的令牌错误:要处理哪些令牌以及如何处理?
- 关于C宏的错误预处理令牌无效
- 粘贴形成了无效的处理令牌"."
- 错误:粘贴"Java_com_my_packagename_myClass_myMethod"和"("未提供有效的预处理令牌
- 为什么qi::skip处理来自词法分析器的令牌时会失败?
- Bison/Flex以相反的顺序处理令牌