有沒有辦法來檢測類型是否在C的預處理器中的指針?如何檢測類型是C中預處理器的指針?
假設它的名字是IS_POINTER。我想要的最終結果可能如下所示:
#define DATA_STRUCTURE(KEY_T)
#if IS_POINTER(KEY_T)
/* do something */
#endif
謝謝!
有沒有辦法來檢測類型是否在C的預處理器中的指針?如何檢測類型是C中預處理器的指針?
假設它的名字是IS_POINTER。我想要的最終結果可能如下所示:
#define DATA_STRUCTURE(KEY_T)
#if IS_POINTER(KEY_T)
/* do something */
#endif
謝謝!
你可以嘗試使用typeof(expr)
,這可能會幫助你完成任務。它沒有確切地告訴你什麼是指針,但也許你可以在比較中使用它:
typeof是預處理器結構還是編譯器結構? –
預處理沒有類型的概念,你可以不寫,可以被用在這樣一個宏#if
指令。相反,您可以使用一些不可移植的內置函數來編寫一個表達式,該表達式檢查給定對象是否爲指針或其他內容。
這裏是一個宏執行靜態斷言a
是一個數組:
#define assert_array(a) \
(sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1)
它可以與gcc
和clang
使用。我用它來使countof()
宏更安全:
#define countof(a) ((ssize_t)(sizeof(a)/sizeof(*(a)) + assert_array(a)))
難道你不知道自從你寫代碼後它是否是指針嗎?我不確定我是否明白你真正想要完成的事情。你問這個問題的目標是什麼? –
我不認爲這是可能的。預處理器對C語言知之甚少,並且實際上在C代碼甚至沒有被解析的時間點執行。根據你想要達到的目標,你可能會對C11的[通用選擇](http://en.cppreference.com/w/c/language/generic)有一些好運。 – 5gon12eder
這聽起來像是[XY問題](http://mywiki.wooledge.org/XyProblem)。你爲什麼需要知道這個?你真的想做什麼? –