4

次のように、指定された初期化子を使用して C99 で構造体を初期化できることを認識しています。

typedef struct
{
    char a;
    char b;
    int c;

} MyStruct;

MyStruct s = {.a = 1, .b = 2, .c = 3};

(そのコードは私の C++ コンパイラでは機能しませんが、(ロシア語の) ウィキペディアはそうすべきだと言っています)

しかし、いくつかの奇妙な理由で、このようなコードもコンパイルされます (そして期待どおりに動作します):

typedef struct
{
    char a;
    char b;
    int c;

} MyStruct;


MyStruct arr[5];

int main(void)
{
    arr[0] = (MyStruct){.a = 1, .b = 2, .c = 0x332211};
}

初期化は、オブジェクトが作成されたときにのみ機能し、その後では機能しないはずだと思いました。

これは通常の動作ですか、それともある種のコンパイラの癖ですか? C++ で動作する必要がありますか? 中括弧で囲まれたこのことは正確には何ですか? ある種の名前のない一時的な構造?Keil uVision 4 を使用しています (指定された初期化子は C++ モードでは機能しません)。

4

3 に答える 3

4

指定初期化子(最初の例) と複合リテラル(2 番目の例) はどちらも C99 で導入されましたが、C++ ではまだサポートされていません。

ただし、一部のコンパイラは、拡張機能として C++ でこれらの機能をサポートする場合があります。たとえば、gcc はC++ の複合リテラルをサポートしていますが、 Designated Initializerはサポートしていません。あなたのコンパイラも同じことをしているようです。

于 2013-10-09T12:47:10.193 に答える