bugfix> c++ > 投稿

以下のマクロを定義すると、コードは正常にコンパイルされます。

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

エラーは、MSS_RSCC、MSS_QDSP6SS_RSCC、およびAOP_RSCCなど、最後の3つのクライアントにのみ発生していることに注意してください。最初のものではない(APCS_RSCC)

どんな手掛かり?

よろしく、

回答 1 件
  • マクロ内で比較を行いました:

    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                             \
    )                                                          \
    
    

    OK、コメントでこのマクロはコンパイルされなかったと言った。元のマクロが同じレベルで連結されたとき、奇妙な動作をしていれば:

    #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
    
    

あなたの答え