调用宏

时间:2018-05-25 10:37:02

标签: 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)

有任何线索吗?

此致

1 个答案:

答案 0 :(得分:0)

您在宏中进行了比较:

APCS_RSCC == client

如果APCS_RSCC本身是有效的 C 标识符,则此功能才有效。预处理器不解析这些比较,但将它们留给编译器。 APCS_RSCC然后可能是另一个解析为某种指针的宏(例如,解析为包含多个地址的结构),或者只是一些裸地址(APCS_RSCC_RSCC_RSC_REG_BASE可能会解析为{{1}或者(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                          \
)
//            ^^