2012-02-24 81 views
6

我想要類似於:C/C++ #define宏內宏?

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

這可能嗎? 也許一些骯髒的黑客#include?

原因: 我做了一個頭結構使用vector<stuff>*類型的成員變量,但在C我想它只是void*,你知道。

TIA

+6

喲耶,我聽說你喜歡宏? – Gui13 2012-02-28 09:18:27

+0

@ Gui13對不起,但你們都想要什麼?你還怎麼在C++和C中使用頭文件? – imacake 2012-03-04 16:19:05

+1

@imacake:嘿,對不起,我只是對一個[互聯網模因](http://knowyourmeme.com/memes/xzibit-yo-dawg)做了一個不好的參考。沒有冒犯要採取:-) – Gui13 2012-03-05 09:47:39

回答

11

什麼是與

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

(離開雙下劃線的名稱,每phresnel此言實施)

+0

這就是我見過的每種情況下的做法。例如,這個模式用於爲WEAK定義一個宏(這意味着一個給定的函數定義可以被另一個編譯單元中的另一個具有相同名稱的另一個替代,而不是停止帶有多重定義錯誤的鏈接器),具體取決於正在使用的編譯器(例如gcc或IAR或Keil)。 – 2012-02-24 13:32:20

+0

只是完美..! – imacake 2012-02-24 13:40:56

1

不在C++中。但你可以

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

我認爲這只是你的病理例子。還要注意,雙下劃線是爲庫實現者保留的(參見17.6.4.3.2全局名稱)。

vector ,但在C中,我希望它只是無效的,你知道的。

那麼,什麼樣反對

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

的解決方案說話或說話什麼的針對不同的編程語言提供了不同的API?

+0

你的意思是,你的例子中'CPP'將是'vector *'''C'將是'void *'?這很好,沒想到它。在沒有找到其他解決方案的情況下會考慮它。 – imacake 2012-02-24 13:31:18

+0

**不同的API **:NO。我實際上正在制定一個有信仰的程序,其中的一切都來自於一條規則,並且應該簡化它(在我的腦海中有多年的哲學,現在正在編寫一個適合它的程序)。 (**解決方案示例**):看起來非常不潔,難以閱讀。爲什麼不問一些更好的東西? = D – imacake 2012-02-24 13:35:10

+0

@imacake:我對規則的事情感到困惑,這與C和C++有什麼關係? – 2012-02-24 13:59:11

1

AProgrammer已經給你正確的答案,但答案「纔有可能」的問題問題的一部分是否定的。在所有預處理器指令處理完畢之前,宏擴展不會發生,因此擴展爲#define#ifdef的任何宏都將作爲常規源文本傳遞給編譯器,這會導致編譯器進行哈希操作。

0

我的英語很差,對於語言錯誤和拼寫錯誤(如果有的話)我感到抱歉。

如果#ifdef不能包裝宏調用,則有一個解決方案不夠優雅。

g ++ only: 您可以在有選擇的場合試試。但是,如果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宏,一個編譯器,comforming標準C++應該產生

#define __cplusplus value 

和值應> = 199711L

+0

不確定這會增加@AProgrammer接受的答案 – 2013-04-29 23:33:59