2011-09-29 54 views
2
#define TYPE char * 

if TYPE is char * 
    do A 
if TYPE is int 
    do B 

是否有一個如何做這樣的事情呢?如何爲每個宏值做不同的事情?

+0

不適用於C宏,但可以使用C++魔術(即使沒有宏)。 – zneak

+0

將TYPE作爲一串字符對待可以嗎?也就是說,如果TYPE是charptr,其中charptr是char *的typedef,那麼可以不匹配char *的情況嗎? –

+1

該標準的下一個版本將有一個填充該差距的構造,所謂的通用選擇與'_Generic'關鍵字。 –

回答

2

C預處理器宏處理文本,所以基本上是無類型的,所以沒有你不能這樣做。

1

你可以用它的另一個符號相關聯:

#define TYPE char * 
#define TYPE_IS_CHAR_STAR 

#ifdef TYPE_IS_CHAR_STAR 
... 
#endif 

你只需要手動讓他們保持一致。

請注意,這是一個危險的宏;您應該改用typedef。隨着宏:

TYPE x, y; 

x是一個指針,但y不是。

0

您可以通過與其它宏定義與類型一起另一個宏,並使用#ifdef等得到類似的效果。例如:

#define TYPE char * 
#define TYPE_IS_PCHAR 1 

......再後來......

#ifdef TYPE_IS_PCHAR 
    do A 
#endif 
#ifdef TYPE_IS_INT 
    do B 
#endif 

這是不太一樣的東西,但它仍然可以讓你在那裏。

0

不容易。你可以這樣做:

#define TYPE_IS_CHARPTR 
//#define TYPE_IS_INT 

#ifdef TYPE_IS_CHARPTR 
    do A 
#endif 
#ifdef TYPE_IS_INT 
    do B 
#endif 

但你真的應該嘗試你的預處理器的技巧性的東西(不是簡單的變量,其他任何東西)的使用最小化。

隨着枚舉常數和內聯函數,有一個爲時下這種用途很少需要。

+0

不僅如此,它似乎'#ifdef ABGC2 || #ifdef DE'也是不可能的,對吧? –

+0

@JeRog #if defined(ABGC2)||定義(DE)' –

0

如果你只是使用基本類型( - 見米奇的答案,因爲他們只是字符串),它的工作。但只要你嘗試使用指針,它不會工作了 - 星號拋出了一個循環的預處理:

[[email protected] ~]$ gcc test.c 
test.c:3:10: error: operator '*' has no right operand 

但是,如果你要根據不同類型做做不同的事情,我將不得不推薦切換到C++並使用templatestemplate specialization。不情願的是,由於模板語法令人難以置信的醜陋,但你應該能夠做任何你想要的。

希望有幫助!

相關問題