VCコンパイラとGCCコンパイラの違い

1487 ワード

今日は何気なくコードを書いたが、VCコンパイラとGUNのgccコンパイラには違いがあることが分かった.結局GCCは標準Cをサポートしています.
#include <stdio.h>

struct Node
{
	int value;
	Node *next;
};
int main()
{
	Node a;
	a.value = 1;
	return 0;
}

上記のコードはGCCの下でコンパイルに失敗し、ヒントのエラー:uknown typename'Node'である.しかし、VCコンパイラの下に置くとスムーズにコンパイルできます.
そこで標準Cに従って別のバージョンを書きました.
#include <stdio.h>

struct Node
{
	int value;
	struct Node *next;
};
int main()
{
	struct Node a;
	a.value = 1;
	return 0;
}

ここでノードの役割はラベルであるため、標準Cでコンパイルされます.タイプとして直接使用できるのはtypedefを使用しない限りです.ラベルの前にstructキーを付けます.
次はtypedefを使用して作成されたタイプ名ですが、構造体内部のポインタを致命するラベルを定義する必要があります.
#include <stdio.h>

typedef struct  Node1 
{
	int value;
	struct Node1 *next;
}Node;
int main()
{
	Node a;
	a.value = 1;
	return 0;
}
でも次のようにGCCでコンパイルしても
#include <stdio.h>

typedef struct 
{
	int value;
	struct Node *next;
}Node;
int main()
{
	Node a;
	a.value = 1;
	return 0;
}

ラベルが宣言されていないため、構造体内部で構造体自体を指すポインタがラベル形式を使用することを説明します.ラベルの前にstructを追加すると、ここで宣言するのは合法的なポインタだと考えられますが、ラベルが宣言されていないため、このポインタが具体的にどのタイプの構造体を指しているのかは分かりません.ここでは危険で、文法検査に合格しただけです.
上記の推測に基づいて、私は別のバージョンを書きました.
#include <stdio.h>

typedef struct 
{
	int value;
	struct Node1 *next;
}Node;
int main()
{
	Node a;
	a.value = 1;
	return 0;
}
このバージョンは、推測が正しいことを示すGCCでコンパイルできます.ここでは、不完全な宣言について説明します.『Cとポインタ』P 199参照