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

Pasting formed an invalid processing token '.'

本文关键字:处理 令牌 无效      更新时间:2023-10-16

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

#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)将为您提供标识符x3triple(12)将为您提供整数123,并且triple(.)将为您提供float .3

但是,您拥有的是.##FuncName,其中FuncNameProcessPreCreate。这创建了单个令牌.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;