3

C99 では、xが以前に宣言されていてタイプが である場合、次のv2ように記述できます。

x = (v2) { 1, 2 };

どこにv2ある:

typedef struct {
    int x;
    int y;
} v2;

C90で似たようなことはできますか?

4

3 に答える 3

2

コンパイラ拡張機能なしで C90 で取得できる最も近いものは次のとおりです。

{
    v2 temp = { 1, 2 };
    x = temp;
}

1行に圧縮するか、マクロに置き換えることができます。(ただし、C には衛生的なマクロがないため、もちろん、変数を宣言するマクロには注意する必要があります。)

于 2012-05-24T19:54:10.140 に答える
2

私の知る限り、複合リテラルはC99で正確に導入されました。ただし、GCC を使用している場合、この機能は拡張機能として利用できます。GCC ドキュメントの引用:

ISO C99 は、複合リテラルをサポートしています。複合リテラルは、初期化子を含むキャストのように見えます。その値は、初期化子で指定された要素を含む、キャストで指定された型のオブジェクトです。それは左辺値です。拡張として、GCC は C90 モードと C++ で複合リテラルをサポートします

GCC のこの機能に関する別の注意事項:

GNU 拡張機能として、GCC は、複合リテラルによる静的ストレージ期間を持つオブジェクトの初期化を許可します (初期化子が定数ではないため、ISO C99 では不可能です)。複合リテラルとオブジェクトの型が一致すれば、括弧で囲んだリストだけでオブジェクトを初期化したものとして扱います。複合リテラルの初期化子リストは定数でなければなりません。初期化されるオブジェクトの配列型が不明なサイズの場合、サイズは複合リテラルのサイズによって決定されます。

static struct foo x = (struct foo) {1, 'a', 'b'};
static int y[] = (int []) {1, 2, 3};
static int z[] = (int [3]) {1};

上記の行は次と同等です。

static struct foo x = {1, 'a', 'b'};
static int y[] = {1, 2, 3};
static int z[] = {1, 0, 0};
于 2012-05-24T19:12:15.773 に答える
1

いいえ、これは C99 の機能です。ただし、gcc などの一部のコンパイラでは、C89 モードで拡張機能として使用できます。

于 2012-05-24T19:11:26.413 に答える