2016-06-01 4 views
1
#include <stdio.h> 

typedef struct test{ 
    int n; 
    struct next{ 
     int x; 
    }level[]; 
}test; 

int main() 
{ 
    printf(" %d \n", sizeof(struct next)); 
    return 0; 
} 

私はこのようにtest.cというコードを持っています。 これはcソースコードからコピーされます。 Gccでコンパイルすると、成功します。 私は、G ++でコンパイルする場合でも、コンパイラは文句を言う:sizeof struct gccは正常にコンパイルされましたが、g ++のコンパイルに失敗しました

test.c: In function ‘int main()’: 
test.c:12:37: error: invalid application of ‘sizeof’ to incomplete type ‘main()::next’ 
    printf(" %d \n", sizeof(struct next)); 

私は長い間、ない結果を検索しています。 ご協力いただきありがとうございます。

+1

あなたの質問は何ですか? – juanchopanza

+2

G ++はC++のフロントエンドです。 C++コードが必要な場合は、正しい拡張子と正しい文法を使用してください。 CとC++は**異なる**言語です(あなたのコードはCのように見えますが、C++と互換性はありません)。 – Olaf

+3

なぜこのCコードはC++としてコンパイルされないのですか? – NathanOliver

答えて

2

CとC++は、異なる規則を持つ異なる言語です。これは、C++が厳密にCのスーパーセットではない例の1つです。

入れ子構造体は、同じ囲み名前空間のメンバーです。したがって、sizeof(struct next)は、以前に完全に宣言されたタイプnextを指し、そのメンバーはxであり、そのサイズはsizeof(int)です。これは正しい形式のコードです。 C++で

、ネストされたクラスは、包含するクラスのメンバーである - そうstruct nextないを行いtest::nextを参照して、代わりにmain()の範囲内のローカル型nextの前方宣言です。このタイプは不完全なので、sizeof()を適用することはできません。

.cで終わるファイルをgccでコンパイルすると、そのコードをCプログラムとしてコンパイルしているので、成功します。 g ++でコンパイルすると、C++プログラムとしてコードがコンパイルされるため、エラーになります。

+3

'struct next {int x; } level []; 'も有効ではありませんC++。 – NathanOliver

+0

@ NathanOliverええ、この質問の目的には関係ありません。質問の問題は、CおよびC++のネストされたクラススコープの違いです。また、gccとclangの両方で拡張子として使用できます。 – Barry

+0

@バリーありがとう。今私はCの構造体とC + +の構造体の違いを知っている。 C++でこの質問のようなcコードを使用することをお勧めしますか? –

1

あなたは

#include <stdio.h> 

struct test{ 
    int n; 
    struct next{ 
     int x; 
    }level[]; 
}; 

int main() 
{ 
    printf(" %d \n", (int)sizeof(test::next)); 
    return 0; 
} 

のようなコードを変更する場合は、C++のために働くだろう。私はg ++でコンパイルします。4.9

+0

ありがとうございます。それは動作します。 –

関連する問題