2017-06-19 2 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ディレクティブ。

逆に、移植性のない組み込み関数を使用して、指定されたオブジェクトがポインタかどうかを確認する式を記述することができます。

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

それはgccclangと一緒に使用することができる:ここ

aが配列であることを静的アサーションを実行するためのマクロです。

#define countof(a) ((ssize_t)(sizeof(a)/sizeof(*(a)) + assert_array(a))) 
関連する問題