3

なぜこれが起こるのか分かりません。私は非常に複雑な構造、共用体、両方の名前のないバージョン、静的変数などを使用しています...しかし、これはうまくいくはずです。デバッグを 1 日行った後、問題を次のコードに絞り込みました。私は -fms-extensions を使用していますが、これはこの状況ではうまく機能しないようです:

//main.c
//Why does y get set to 0 in the case of 'Breaks'?
//Compile with gcc -fms-extensions main.c

#include <stdio.h>

struct Base {
    int x;
    int y;
};

struct Extend {
    union {
        int X;
        struct Base;
    };
};

struct AlsoExtend {
    struct Base;
    int z;
};

static struct Extend Works = {
    .x = 5,
    .y = 3,
    //.X = 2
};

static struct Extend Breaks = {
    .x = 5,
    .y = 3,
    .X = 2
};

static struct AlsoExtend AlsoWorks = {
    .x = 5,
    .y = 3,
    .z = 69
};

int main(int argc, char** argv) {

    printf("Works: x:%d y:%d X:%d\n", Works.x, Works.y, Works.X);
    printf("Breaks: x:%d y:%d X:%d\n", Breaks.x, Breaks.y, Breaks.X);
    printf("AlsoWorks: x:%d y:%d z:%d\n", AlsoWorks.x, AlsoWorks.y, AlsoWorks.z);

    return 0;
}
4

2 に答える 2

5

C99 仕様には、次のように 記載されています。

値が共用体型のオブジェクトのメンバーに格納される場合、そのメンバーに対応しないが他のメンバーに対応するオブジェクト表現のバイトは未指定の値を取ります。

ここでは、共用体型の 1 つのオブジェクトを使用して 1 つの値を書き込み、この共用体型の他のオブジェクトにアクセスしようとした後です。これは、型に予測できない値をもたらします。

したがって、このようなことはできません。構造体の同じインスタンスに対して、共用体の 1 つのオブジェクトのみを使用する必要があります。

于 2013-01-01T02:09:41.890 に答える
1

@lbonn が言うように、あなたは C を悪用しています!

-fms-extensions上記で試みたような、そうでなければ不可能な宣言を含む、非標準の構造のサポートを有効にする GCC 固有のオプションです。

簡単な答えは、「そうしないでください!」です。真剣に。を使用し-fms-extensionsないでください。特に、独自のコードには使用しないでください。これまで!

標準 C に準拠した宣言を作成すると、問題を見つけやすくなることが期待されます。

@lbonn の回答で引用されているテキストを注意深く読み、他の値と同じように未指定0の値であることに注意してください。

于 2013-01-01T02:13:10.250 に答える