[英]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.