带有和不带结构名称的Typedef

时间:2017-05-24 14:09:19

标签: c struct typedef

我在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中的错误?

3 个答案:

答案 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