2017-05-24 63 views
2

我在XCB API標頭中看到了以下奇怪現象。大多數類型都以這種方式使用類型別名和結構名稱來定義:Typedef有和沒有結構名稱

typedef struct xcb_window_iterator_t { 
    xcb_window_t *data; 
    int rem; 
    int index; 
} xcb_window_iterator_t; 

但是某些typedefs省略了結構名稱。

typedef struct { 
    unsigned int sequence; 
} xcb_void_cookie_t; 

從C的角度來看,這是什麼意思?

後者是一個名稱和結構沒有名稱的類型?或者它不是類型,而只是一個帶有名字的結構?

我的疑惑來自gccxml的輸出。

對於xcb_window_iterator_t它會產生一個Struct節點:

$ xmllint --format --xpath '//Struct[@name="xcb_window_iterator_t"]' xcb.xml 
<Struct id="_199" name="xcb_window_iterator_t" context="_1" mangled="21xcb_window_iterator_t" demangled="xcb_window_iterator_t" location="f0:43" file="f0" line="43" artificial="1" size="128" align="64" members="_2240 _2241 _2242 _2243 _2244 _2245 _2246 " bases=""/> 

Typedef節點:

$ xmllint --format --xpath '//Typedef[@name="xcb_window_iterator_t"]' xcb.xml 
<Typedef id="_200" name="xcb_window_iterator_t" type="_199" context="_1" location="f0:47" file="f0" line="47"/> 

xcb_void_cookie_t其產生只是一個Struct節點:

$ xmllint --format --xpath '//Struct[@name="xcb_void_cookie_t"]' xcb.xml 
<Struct id="_967" name="xcb_void_cookie_t" context="_1" mangled="17xcb_void_cookie_t" demangled="xcb_void_cookie_t" location="f14:189" file="f14" line="189" size="32" align="32" members="_3655 _3656 _3657 _3658 _3659 " bases=""/> 

但是,沒有Typedef節點:

$ xmllint --format --xpath '//Typedef[@name="xcb_void_cookie_t"]' xcb.xml 
XPath set is empty 

這是否意味着xcb_void_cookie_t是沒有類型,但只是一個結構,雖然代碼包含typedef?或者它是gccxml中的一個錯誤?

+0

你不應該對的typedef結構在所有的麻煩。他們沒用。它們只會節省你在這裏和那裏輸入「struct」,但是混淆了一些結構,並且需要用'.'或' - >'來操作。 – Jens

+2

@Jens:這是一個觀點 - 由尊敬的程序員持有。這不是唯一的觀點 - 其他受尊敬的程序員更喜歡替代方案。 –

回答

1

如果你有

typedef struct structname { 
    .. 
} typename; 

,你可以這樣寫來聲明一個變量a

struct structname a; 

typename a; 

如果你有

typedef struct { 
    .. 
} typename; 

你只能寫來聲明一個變量a

typename a; 
2

第1段定義了兩種類型:

  • struct xcb_window_iterator_t
  • xcb_window_iterator_t

洛杉磯tter之一:

  • xcb_void_cookie_t

是對LAT [T] ER具有名稱的類型和結構沒有名字

是的,typedef限定"unnamed" (or "anonymous") structure

struct 
{ 
    unsigned int sequence; 
} 

作爲類型xcb_void_cookie_t

+0

然後GCCXML是越野車,因爲它報告一個命名結構和沒有typedef?右邊是一個沒有名字的結構和一個帶有名字的typedef。 – ceving

1

struct關鍵字後面的名稱是可選的。在typedef的上下文中,這意味着結構的一個實例只能用給定的typedef來聲明。

在第一typedef的情況下,您可以通過以下兩種方式聲明此類型的變量:

  • struct xcb_window_iterator_t var
  • xcb_window_iterator_t var

在後一種情況下,該類型的變量必須聲明爲:

  • xcb_void_cookie_t var