1

gcc 4.4.6 で正常にコンパイルされた構造に関する次のソースがあります。

struct st1
{
    char name[12];
    int heartbeat ;
    double price ;
    int iFlag ;
} ;

struct st2  {
    struct st1 ;
    char pad[64 - sizeof(struct st1)] ;
} __attribute__((aligned(64))) ;

int main (void)
{
    printf("length of struct st2=(%d)\n",sizeof(struct st2) ) ;
}


gcc -fms-extensions test1.c -o test1.exe

./test1.exe ===> length of struct st2=(64)

test1.c を test1.cpp にコピーし、次のようにコンパイルしようとします。

g++ -fms-extensions test1.cpp -o test1.exe 

そして、私は得ました:

test1.cpp:23: エラー: 不完全な型 st2::st1 への sizeof の適用が無効です

私はこのエラーが char pad[64 - sizeof(struct st1)] ; を示していることを知っています。g++ では動作しませんが、gcc では動作しますが、これが g++ で動作するのが気に入ったら、どうすればよいですか?

4

2 に答える 2

3

あなたの構造体st2で:

struct st1 ;

これは a の前方宣言ですstruct st1。ここで、あなたは基本的にコンパイラにこう言ってstruct st1struct st2ますst2::st1。プロパティを提供していないため、コンパイラは「不完全な型」エラーを発生させます。この型のサイズを認識できないため、sizeof.

のインスタンスが必要な場合は、次のように記述struct st1します。struct st2

struct st1 my_variable_name;

これにより、 のインスタンスが効果的に追加struct st1されますstruct st2

のインスタンスが必要ない場合は、この行を削除struct st1してください。上記で宣言されているため、struct st2コンパイラは について既に認識しています。struct st1

于 2013-04-02T04:42:37.043 に答える
0

「構造体」を削除し、sizeof(st1) を使用してください。「構造体」を追加することで、st2 のスコープで新しい構造体 st1 を定義するようコンパイラーに指示します。したがって、「st2::st1」と表示される理由です。

于 2013-04-02T04:43:48.133 に答える