2010-10-12 94 views
4

什麼是不完整的類型對象類型 in C?另外,你能否提供一些例子?C中的Incomplete Type和Object Type的定義是什麼?

ANSI C99在各個地方都提到了這兩種類型的類別,儘管我發現很難理解它們每個意思的含義(沒有明確定義它們的段落/句子)。

+1

C99使用_reference type_?真? (如果您有C99規範可用,6.2.5深入討論了C類型系統;它以三個頂級類型類別的定義開始:對象類型,函數類型和不完整類型) – 2010-10-12 18:20:36

+0

我的錯誤是,噸。我會從問題中刪除它。謝謝你的收穫! – 2010-10-12 18:22:18

+0

這就是我所指的部分,但沒有發佈在我的問題中。 ;)6.2.5提到了那些最高級別的類別,但似乎並沒有說「內容是什麼」。函數類型很容易理解,但我仍然對不完整類型和對象類型之間的差異感到困惑。對於不完整類型,「描述對象的類型,但缺乏確定其大小所需的信息」 - 缺少確定其大小所需信息的示例是什麼? – 2010-10-12 18:27:52

回答

6

讓我們去online C standard (draft n1256)

6.2.5類型

1被確定存儲在對象或函數的返回值的含義用於訪問它的表達式的 類型。 (聲明爲對象的標識符是最簡單的表達式;類型在標識符的聲明中指定。)類型分區爲 對象類型(完全描述對象的類型), 函數類型(描述類型函數)和 不完整類型(描述對象的類型,但缺少確定其大小所需的信息)。 不完全類型的

例子:

struct f; // introduces struct f tag, but no struct definition 
int a[];  // introduces a as an array but with no defined size 

不能創建不完全類型的實例,但你可以創建的指針和不完全類型的typedef名稱:

struct f *foo; 
typedef struct f Ftype; 

要關閉不完整的結構類型轉換爲對象類型,我們必須定義結構:

struct f 
{ 
    int x; 
    char *y; 
}; 
+0

謝謝約翰,非常明確的答案! :) – 2010-10-12 19:04:42

0

我知道的類型有:

  • 不完全型
  • 對象類型
  • 功能類型

下面是一個例子(也鍵盤:http://codepad.org/bzovTRmz

#include <stddef.h> 

int main(void) { 
    int i; 
    struct incomplete *p1; 
    int *p2; 
    int (*p3)(void); 

    p1 = NULL; /* p1 is a pointer to a incomplete type */ 
    p2 = &i; /* p2 is a pointer to an object */ 
    p3 = main; /* p3 is a pointer to a function */ 

    return 0; 
} 

0123可以在另一個翻譯單元中定義(具有確定的大小)。這個翻譯單元只需要指針雖然

+0

感謝您的答案pmg! – 2010-10-12 19:04:58

相關問題