2017-06-19 85 views
1

有沒有辦法來檢測類型是否在C的預處理器中的指針?如何檢測類型是C中預處理器的指針?

假設它的名字是IS_POINTER。我想要的最終結果可能如下所示:

#define DATA_STRUCTURE(KEY_T) 

#if IS_POINTER(KEY_T) 
/* do something */ 
#endif 

謝謝!

+1

難道你不知道自從你寫代碼後它是否是指針嗎?我不確定我是否明白你真正想要完成的事情。你問這個問題的目標是什麼? –

+1

我不認爲這是可能的。預處理器對C語言知之甚少,並且實際上在C代碼甚至沒有被解析的時間點執行。根據你想要達到的目標,你可能會對C11的[通用選擇](http://en.cppreference.com/w/c/language/generic)有一些好運。 – 5gon12eder

+1

這聽起來像是[XY問題](http://mywiki.wooledge.org/XyProblem)。你爲什麼需要知道這個?你真的想做什麼? –

回答

0

你可以嘗試使用typeof(expr),這可能會幫助你完成任務。它沒有確切地告訴你什麼是指針,但也許你可以在比較中使用它:

https://gcc.gnu.org/onlinedocs/gcc/Typeof.html

+1

typeof是預處理器結構還是編譯器結構? –

0

預處理沒有類型的概念,你可以不寫,可以被用在這樣一個宏#if指令。相反,您可以使用一些不可移植的內置函數來編寫一個表達式,該表達式檢查給定對象是否爲指針或其他內容。

這裏是一個宏執行靜態斷言a是一個數組:

#define assert_array(a) \ 
    (sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1) 

它可以與gccclang使用。我用它來使countof()宏更安全:

#define countof(a) ((ssize_t)(sizeof(a)/sizeof(*(a)) + assert_array(a)))