11

C データ型を変数に格納することは可能ですか?

このようなもの:

void* type = (byte*);

これは、テスト ケースを作成し、特定のパラメーターに応じて、printf で使用する特定のデータ型を使用してバイト配列を出力しようとしたシナリオです。

void print_byteArray(const void* expected, size_t size, 
        bool asChars, bool asWCharT) {
    int iterations;
    char* format;
    if (asChars) {
        iterations = (size / (sizeof (char)));
        format = "%c";
    } else if (asWCharT) {
        iterations = (size / (sizeof (wchar_t)));
        format = "%lc";
    } else {
        iterations = (size / (sizeof (byte)));
        format = "%x";
    }
    int i;
    for (i = 0; i < iterations; i++) {
        if (asChars) {
            printf(format, ((char*) expected)[i]);
        } else if (asWCharT) {
            printf(format, ((wchar_t*) expected)[i]);
        } else {
            printf(format, ((byte*) expected)[i]);
        }
    }
    fflush(stdout);
}

これは非効率なコードのように見えます。for ループ本体のサイズを 1 行に縮小できると思います。

printf(format, ((type) expected)[i]);
4

2 に答える 2

15

いいえ、標準 C に型を格納できるような型はありません。

gcc はtypeof便利な拡張機能を提供します。このキーワードを使用する構文は のようsizeofに見えますが、構文は で定義された型名のように意味的に機能しtypedefます。詳しくはこちらをご覧ください。

の使用例をいくつか示しますtypeof

これは、x が指す型で y を宣言します。

typeof (*x) y;

これは、y をそのような値の配列として宣言します。

typeof (*x) y[4];

これは、文字へのポインターの配列として y を宣言します。

typeof (typeof (char *)[4]) y;

これは、次の従来の C 宣言と同等です。

char *y[4];

typeof を使用した宣言の意味と、それが有用な記述方法である理由を確認するには、次のマクロを使用して宣言を書き直します。

#define pointer(T)  typeof(T *)
#define array(T, N) typeof(T [N])

これで、宣言を次のように書き直すことができます。

array (pointer (char), 4) y;

したがって、array (pointer (char), 4)char への 4 つのポインターの配列の型です。

于 2013-07-15T00:42:36.700 に答える