簡體   English   中英

C / C ++ #define宏內宏?

[英]C/C++ #define Macro inside macro?

我想要像:

#define C_OR_CPP(C__, CPP__) #ifdef __cplusplus\
CPP__\
#else\
C__\
#endif

可能嗎? 也許#include有些骯臟的黑客?

原因:我創建了一個頭部,其中一個結構使用了一個類型為vector<stuff>*的成員變量,但是在C中我希望​​它只是void* ,你知道。

TIA

有什么問題

#ifdef __cplusplus
#define C_OR_CPP(C, CPP) CPP
#else
#define C_OR_CPP(C, CPP) C
#endif

(將雙下划線的名稱留給每個菲涅耳評論的實現)

不是在C ++中。 但是你可以

#ifdef __cplusplus
# define CPP
#else
# define C
#endif

我認為這只是你的一個病態例子。 另請注意,雙重下划線保留給庫實現者(請參見17.6.4.3.2全局名稱)。

矢量,但在C中我希望​​它只是無效 ,你知道。

那么,什么反對像這樣的解決方案

struct Foo {
  #ifdef __cplusplus
  ...
  #else
  ...
  #endif
};

或者反對為不同的編程語言提供不同的API?

AProgrammer已經給你正確的答案,但問題的“可能”部分的答案是否定的。 在處理完所有預處理程序指令之后才會發生宏擴展,因此任何擴展為#define#ifdef宏都將作為常規源文本傳遞給編譯器,這將導致編譯器氂牛。

我的英語很差,如果有語言錯誤和錯別字,我很抱歉。

如果#ifdef不能包裝宏調用,那么解決方案就不那么優雅了。

僅限g ++:你可以在選擇性場合嘗試這個。 但是如果a或b中有逗號,則仍需要解決方法。 它只是基於這樣一個事實:__ cplusplus在C ++環境中定義為“1”,而在沒有的情況下保持自身。

#define SELECT1(a, b) a
#define SELECT__cplusplus(a, b) b
#define xcat(a,b)  a##b
#define concat(...) xcat(__VA_ARGS__)
#define C_OR_CPP(C, CPP) concat(SELECT, __cplusplus)(C, CPP)

C_OR_CPP(1, 2)

其他環境檢查__cplusplus宏,這是一個符合標准C ++的編譯器應該生成的

 #define __cplusplus value 

和值應> = 199711L

暫無
暫無

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

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