2011-10-16 4 views
2

FORMAT_OF(type)の書き込み方法は,などとなります。マクロで特定の基本データ型のprintf形式を取得するのはなぜですか?

基本データ型のフォーマットを取得するマクロはありますか?

+0

あなたは正確に何を達成しようとしていますか?あなたのプログラム内のオブジェクトのデータ型を知っている必要があります... – sarnold

+0

@sarnold、私の場合は 'type'もマクロによって定義されています。 –

+0

C1Xまでは、変数とともに 'fmt'をとるマクロを書く必要があります。 –

答えて

1

現在、標準化されたバージョンのCでは、この種の型のイントロスペクションはサポートされていません。

+0

C11には '_Generic'式があります。 –

-2

Cにはマクロがありませんが、これを実現するためのラッパー関数を簡単に書くことができます。

+2

C++を使用せずに、どのようにラッパー関数を記述できますか? –

+0

このような関数を(C201Xの '_Generic'を使用せずに)どのように記述しますか? –

+0

'sizeof'やその他のトリックを使って、限られた範囲のタイプ(' float'/'double' /' long double'など)でこれを行うことができますが、これは一般的には機能しません。 –

5

はい。しかし、それはC11でのみ利用可能です。

#define FORMAT_OF(x) _Generic((x), \ 
    int: "%d", \ 
    unsigned: "%u", \ 
    const char *: "%s", \ 
    void *: "%p") 

値の代わりにタイプの場合は、_Generic((type) 0, ...を試すことができます。

コンパイラはおそらくC11をサポートしていません。 GCC 4.6(しかし4.5ではなく)は-std=c1xまたは-std=gnu1xでいくつかのC11サポートを有効にしていますが、私は_Genericがまだサポートされていないと思います。まあ

+0

既にC11ですか?それともまだC1Xですか? –

+1

@ChrisLutz:私は、標準が最後から2番目の投票で全会一致で支持されたと主張する記事を読んでいます。つまり、最終投票はスキップされます。私はどこの記事を読んでいるのか分からず、WGページの情報を見つけることができませんでした。私はそれがまだC11として出版されたとは思わないが、そうなるだろう。 –

+0

私たちがしなければならないことは、コンパイラがそれをサポートするための新しいドラフトを書くまで10年待つだけです。(また、 'const char *'の代わりに 'char * _Generic'は 'const'と' nonconst'型を区別するために '_Generic'を使うことができますか?) –

0

、あなただけのマクロはタイプを利用したい場合、あなたはできます

#define FORMAT_int "%d" 
#define FORMAT_char "%c" 
... 
#define FORMAT(x) FORMAT_##x 

と後でFORMAT(int)を使用します。しかし

int i; 
FORMAT(i); 

仕事、そしてFORMAT(char*)はどちらか動作しませんではないでしょう。

関連する問題