c++ - 调用宏时参数太多

标签 c++ c macros c-preprocessor

当我定义以下宏时,代码可以正常编译:

 #define RSC_HWIO_INXFI(client,drvID,reg,index,field)    HWIO_INXFI((APCS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), APCS_RSCC_##reg,index,field) 

但是当我包含条件运算符以包含更多客户端/目标时,我收到错误“宏调用中的参数太多”

#define RSC_HWIO_INXFI(client,drvID,reg,index,field)    \
                    (APCS_RSCC         == client ? HWIO_INXFI((APCS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), APCS_RSCC_##reg,index,field) : \
                    (MSS_RSCC          == client ? HWIO_INXFI((MSS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), MSS_RSCC_##reg,index,field) : \
                    (MSS_QDSP6SS_RSCC  == client ? HWIO_INXFI((MSS_QDSP6SS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), MSS_QDSP6SS_RSCC_##reg,index,field) : \
                    (AOP_RSCC          == client ? HWIO_INXFI((AOP_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), AOP_RSCC_##reg,index,field) : HWIO_INXFI((APCS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), APCS_RSCC_##reg,index,field)))))

需要注意的是,错误仅出现在最后 3 个客户端,即 MSS_RSCC、MSS_QDSP6SS_RSCC 和 AOP_RSCC。不适用于第一个 (APCS_RSCC)

有什么线索吗?

问候,

最佳答案

您在宏中引入了比较:

APCS_RSCC == client

仅当 APCS_RSCC 本身是有效的 C 标识符时,此方法才有效。预处理器不会解析此类比较,而是将它们留给编译器。 APCS_RSCC可能是另一个解析为某种指针的宏(例如指向包含多个地址的结构),或者只是一些裸地址(APCS_RSCC_RSCC_RSC_REG_BASE然后可能解析为类似的内容(APCS_RSCC->RSCC_RSC_REG_BASE)(APCS_RSCC + RSCC_RSC_REG_BASE)。不过,命名并没有给我这样的定义的印象...

现在串联是可行的方法:

#define RSC_HWIO_INXFI(client,drvID,reg,index,field)       \
HWIO_INXFI(                                                \
    client##_RSCC_RSC_REG_BASE + RSC_DRV_OFFSET(drvID),    \
    client##_##reg,index,field                             \
)                                                          \

好的,现在你在评论中告诉我这个宏无法编译。假设原始宏有效,很奇怪,因为您在同一级别上连接:

#define RSC_HWIO_INXFI(client,drvID,reg,index,field)       \
HWIO_INXFI(                                                \
    (APCS_RSCC_RSCC_RSC_REG_BASE + RSC_DRV_OFFSET(drvID)), \
    APCS_RSCC_##reg, index, field                          \
)
//            ^^

您可以通过间接连接来规避该问题(类似于字符串化,您已经遇到过这些宏吗?):

#define RSC_HWIO_INXFI(client, drvID, reg, index, field)           \
HWIO_INXFI(                                                        \
    CONCAT3(client, _, RSCC_RSC_REG_BASE) + RSC_DRV_OFFSET(drvID), \
    CONCAT3(client, _, reg), index, field                          \
)
#define CONCAT3(X, Y, Z) X##Y##Z

关于c++ - 调用宏时参数太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50527287/

相关文章:

c++ - 为什么我们需要strcpy()?

c++ - 评估宏中传递的参数

c - 文件的父目录

c - 静态分析“指向本地外部范围的指针”——误报?

c++ - 回调宏 (QT)

c++ - 对 C 宏的 undefined reference ,但在我定义它时会出现重新定义的错误

c++ - 在 UE4.22.3 及以上版本中将用户输入绑定(bind)到 UActorComponent 方法

C++ getkey() 和 kbhit() 作用于错误的窗口

c++ - 有没有办法将 OpenCV 中的 minAreaRect 与 double 一起使用?

c++ - 使用 stub 和模拟在 C++ 中进行有效测试? (可能的?)