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

 #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/

10-09 03:39