2014-09-26 52 views
1

我使用gcc編譯器編譯下面的C碼錯誤:編譯器沒有顯示在未定義類型的聲明指針

#include <stdio.h> 

struct node{ 
     int info; 
     struct test* next; 
}; 

int main() 
{ 
     struct node start; 
     struct node* p; 
     start.info = 2; 
     start.next = (struct test*)&start; 
     printf("start.next = %p \n",start.next); 
     p = start.next; 
     printf("p->info = %d\n",p->info); 
} 

但想不到,宣告next(在structure node)作爲指針不宣類型後( struct test),仍然編譯成功!上述程序編譯後的印刷只是一個警告如下:

test.c:15:4: warning: assignment from incompatible pointer type [enabled by default] 
    p = start.next; 
    ^

現在我的疑問是,爲什麼編譯器不產生不聲明structure test錯誤?

回答

6

程序中沒有未定義的類型。在結構struct node內聲明的不完整類型struct test。 您可以使用指向不完整類型的指針。

,這將是更加清晰考慮一個簡單的例子

struct node{ 
     int info; 
     struct node* next; 
}; 

在這個結構指針旁邊還指出,不完全類型struct node由於結構的定義,只會在大括號之後完成。

一個更有趣的例子。在C程序中使用的類型是void *。但根據C標準(6.2.5類型,第#19頁)

19 void類型包含一組空值; 這是一個 不完整的對象類型,無法完成。

至於指針本身然後(C標準,6.2.5類型,第#21)

A pointer type is a complete object type. 

約在結構本身(6.7.2.1結構和聯合說明符,第#8 )

8一個結構聲明列表的在 結構 - 或聯合說明符的存在聲明新的類型,翻譯 單元內。 struct-declaration-list是結構或聯合的成員的一系列聲明。如果結構聲明列表 不包含任何命名成員,沒有匿名結構,也沒有匿名聯合,則行爲是未定義的。 類型是不完整的,直到 緊接在終止列表之後,並且此後完成

1

根據explicit type conversion部從cppreference:

此外,C樣式轉換符號被允許從鑄造到,和指針不完全類類型之間 。如果expression和 new_type都是指向不完全類類型的指針,則不指定 是否選擇static_cast或reinterpret_cast。

struct test*是指向不完整類型的指針。 struct test是一個前置聲明,正在引入main的本地範圍。

相關問題