我在XCB API标头中看到了以下奇怪之处。大多数类型都以这种方式使用类型别名和结构名称定义:
typedef struct xcb_window_iterator_t {
xcb_window_t *data;
int rem;
int index;
} xcb_window_iterator_t;
但是有些typedef省略了struct name。
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 :(得分:2)
第一个片段定义了两种类型:
struct xcb_window_iterator_t
xcb_window_iterator_t
后者:
xcb_void_cookie_t
lat [t]是一个带有名称的类型和一个没有名称的结构
是的,typedef
定义了"unnamed" (or "anonymous") structure
struct
{
unsigned int sequence;
}
作为类型xcb_void_cookie_t
。
答案 1 :(得分:1)
如果你有
typedef struct structname {
..
} typename;
你可以写这个来声明一个变量a
:
struct structname a;
或
typename a;
如果你有
typedef struct {
..
} typename;
你只能写这个来声明一个变量a
:
typename a;
答案 2 :(得分:1)
struct
关键字后面的名称是可选的。在typedef
的上下文中,这意味着结构的实例只能使用给定的typedef
声明。
对于第一个typedef
,您可以通过以下任一方式声明此类型的变量:
struct xcb_window_iterator_t var
xcb_window_iterator_t var
。 在后一种情况下,该类型的变量必须声明为:
xcb_void_cookie_t var