簡體   English   中英

#ifdef宏調用中的內容適用於gcc,但不適用於msvc

[英]#ifdef inside a macro call works with gcc but not with msvc

我有一個帶有可變參數的宏TYPELIST。 我想要類似的東西

typedef TYPELIST(A
                ,B
                ,C
                ,D
#ifdef BLA_
                ,E
#endif
                ,F)

這與gcc完美配合。 但是,當我嘗試使用MSVC對其進行編譯時,它將ifdef和endif解析為宏參數。 我知道一種方法是將宏調用放在ifdef中。 但是,如果我的清單很大,並且要根據定義的不同宏包括不同的類,那將變得很乏味。 為什么在gcc中而不是在MSVC中起作用,是否有特定原因?

在宏中使用#ifdef是不合法的。 我很驚訝gcc允許這樣做。 恐怕您必須將#ifdef放在整個定義周圍,即

#ifdef BLA_
    typedef TYPELIST(a,b,c,d,e,f)
#else
    typedef TYPELIST(a,b,c,d,f)
#endif

根據該標准(第16.3.4 / 3節),“即使將最終得到的,完全替換為宏的預處理令牌序列類似,也不會作為預處理指令進行處理。” 如果g ++在這里處理#ifdef/#endif ,則這是編譯器中的錯誤(至少在您要求標准一致性的情況下,例如-std=... )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM