2
#include <stdio.h>
#define Type int

int main()
{
        Type x=3;
        printf("%d",x);
        return 0;

}

コードはシンプルで、問題なく動作します。私の質問は、私 が soに変更#define Type intし た場合、私も変更する必要があるということです。すべての 、、などで機能するジェネリック指定子を持つ方法はありますか?#define Type float%d%fintfloatcharstring#define Type intprintf()

4

2 に答える 2

5

これは私が提案するものです:

#include <stdio.h>

#define TYPE int
#define TYPE_FORMAT "%d"

int main()
{
    TYPE x=3;
    printf("Value of x is: " TYPE_FORMAT "\n", x);
    return 0;
}

C で型を自動検出する方法はありませんprintf()。C++ では、オーバーロードされた<<演算子を使用できます。これは型を自動的に把握しますが、C にはそのようなものはありません

ただし#define、型だけでなく形式も指定できます。複数の文字列リテラルを並べて配置すると、C コンパイラはそれらを単一の文字列定数に自動マージします。

PSタイプに使用する代わりに、#defineおそらく次typedefのように使用する必要があります。

typedef int TYPE;

これは、デバッガーでは、変数xが typeTYPEである#defineことがわかりますが、 では type として表示されることを意味しますint

そして完璧な世界では、フォーマット文字列を次のように宣言します。

static char const * const TYPE_FORMAT = "%d";

しかし、私たちは完璧な世界に住んでいるわけではありません。に対して上記の宣言を行う場合TYPE_FORMAT、コンパイラはおそらく、文字列を他の文字列リテラルとマージするほど賢くありません。(GCC で試してみたところ、予想どおりエラー メッセージが表示されました。) したがって、TYPE_FORMAT絶対に #define を使用する必要があります。

要約:typedefタイプには を使用しますが#define、フォーマットには を使用します。

于 2012-08-02T19:40:01.270 に答える
2

新しい C 標準 C11 では、このような型ジェネリック式を使用できます

#define MYFORMAT(X) \
_Generic(+(X)       \
   int: "%d",       \
   float: "%g",     \
   double: "%g",    \
   ... whatever ... \
)

そして、これを次のように使用します

printf("the value is " MYFORMAT(x), x);

clang コンパイラの最新バージョンは_Generic既に実装されているため、これを使用しない理由はありません。

于 2012-08-02T20:18:53.163 に答える