回答
C預處理器宏處理文本,所以基本上是無類型的,所以沒有你不能這樣做。
你可以用它的另一個符號相關聯:
#define TYPE char *
#define TYPE_IS_CHAR_STAR
#ifdef TYPE_IS_CHAR_STAR
...
#endif
你只需要手動讓他們保持一致。
請注意,這是一個危險的宏;您應該改用typedef
。隨着宏:
TYPE x, y;
x
是一個指針,但y
不是。
您可以通過與其它宏定義與類型一起另一個宏,並使用#ifdef
等得到類似的效果。例如:
#define TYPE char *
#define TYPE_IS_PCHAR 1
......再後來......
#ifdef TYPE_IS_PCHAR
do A
#endif
#ifdef TYPE_IS_INT
do B
#endif
這是不太一樣的東西,但它仍然可以讓你在那裏。
不容易。你可以這樣做:
#define TYPE_IS_CHARPTR
//#define TYPE_IS_INT
#ifdef TYPE_IS_CHARPTR
do A
#endif
#ifdef TYPE_IS_INT
do B
#endif
但你真的應該嘗試你的預處理器的技巧性的東西(不是簡單的變量,其他任何東西)的使用最小化。
隨着枚舉常數和內聯函數,有一個爲時下這種用途很少需要。
不僅如此,它似乎'#ifdef ABGC2 || #ifdef DE'也是不可能的,對吧? –
@JeRog #if defined(ABGC2)||定義(DE)' –
如果你只是使用基本類型( - 見米奇的答案,因爲他們只是字符串),它的工作。但只要你嘗試使用指針,它不會工作了 - 星號拋出了一個循環的預處理:
[[email protected] ~]$ gcc test.c
test.c:3:10: error: operator '*' has no right operand
但是,如果你要根據不同類型做做不同的事情,我將不得不推薦切換到C++並使用templates和template specialization。不情願的是,由於模板語法令人難以置信的醜陋,但你應該能夠做任何你想要的。
希望有幫助!
- 1. 做一個onClick事件,每隔一次點擊做一些不同的事情?
- 2. Java 8重構switch語句,爲每種情況做不同的事情
- 3. 如何讓1個按鈕改變ID做不同的事情?
- 4. gclient同步不會做任何事情
- 5. 如何讓按鈕在iOS的每個屏幕上都做同樣的事情?
- 6. 我做的直到宏沒有做任何事情
- 7. AsyncTask執行後做不同的事情?
- 8. 兩個腳本做同樣的事情
- 9. 爲什麼close()不做任何事情?
- 10. 爲什麼RunThis()不做任何事情?
- 11. 爲什麼ListDensityPlot不做任何事情?
- 12. 兩個不同的INSERT INTO語句做同樣的事情
- 13. 做const if語句和Go中的#ifdef宏做同樣的事情嗎?
- 14. JScrollBar不做任何事情
- 15. 如何讓PHP做同樣的事情我的ColdFusion做
- 16. 如何使用掃描儀做不同的事情與令牌
- 17. 應用相同的事件,多個畫布,但每帆布做不同的事情 - Jquery的
- 18. 爲另一個類做事情的類
- 19. 爲什麼添加到列表中會做不同的事情?
- 20. 我如何用python(GUI)上的2個按鈕做兩件不同的事情?
- 21. 如何使用此片段爲檢測到的每種語言做出不同的事情?
- 22. 如何爲每個視圖加載不同的事件源(json)?
- 23. 多個小工具可以做不同的事情 - Android App
- 24. jQuery的 - 點擊事件做不同的事情
- 25. 高價值沒有做任何事情?
- 26. 如何爲每個不同的元素使用一個數組的每個值
- 27. 爲什麼這個ruby代碼不能做任何事情?
- 28. 如何爲每個控制器做一個共同的旋轉?
- 29. WordPress的add_meta_box不會做任何事情
- 30. jQuery的.serialize()不會做任何事情
不適用於C宏,但可以使用C++魔術(即使沒有宏)。 – zneak
將TYPE作爲一串字符對待可以嗎?也就是說,如果TYPE是charptr,其中charptr是char *的typedef,那麼可以不匹配char *的情況嗎? –
該標準的下一個版本將有一個填充該差距的構造,所謂的通用選擇與'_Generic'關鍵字。 –