关于C#:带有和不带结构名称的Typedef

Typedef with and without struct name

本问题已经有最佳答案,请猛点这里访问。

我在XCBAPI头中看到了以下奇怪的地方。大多数类型都是用类型别名和结构名称定义的,方法如下:

1
2
3
4
5
typedef struct xcb_window_iterator_t {
    xcb_window_t *data;
    int rem;
    int index;
} xcb_window_iterator_t;

但有些typedef省略了结构名。

1
2
3
typedef struct {
    unsigned int sequence;
} xcb_void_cookie_t;

从C的角度来看,这意味着什么?

后者是具有名称的类型还是没有名称的结构?或者它不是类型,只是一个具有名称的结构?

我的困惑来自于gccxml的输出。

对于xcb_window_iterator_t生成Struct节点:

1
2
$ 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节点:

1
2
$ 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节点:

1
2
$ 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节点:

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

这是否意味着尽管代码包含Typedef,但xcb_void_cookie_t不是类型,而是结构?或者它是gccxml中的一个bug?


第一个代码段定义了两种类型:

  • struct xcb_window_iterator_t
  • xcb_window_iterator_t

后者:

  • xcb_void_cookie_t

Is the lat[t]er a type with a name and a struct without a name

是的,typedef定义了一个"未命名"(或"匿名")结构。

1
2
3
4
struct
{
  unsigned int sequence;
}

作为xcb_void_cookie_t型。


struct关键字后面的名称是可选的。在typedef的上下文中,这意味着结构的实例只能用给定的typedef声明。

在第一个typedef的情况下,可以用以下任何一种方法声明此类型的变量:

  • struct xcb_window_iterator_t var
  • xcb_window_iterator_t var

在后一种情况下,该类型的变量必须声明为:

  • xcb_void_cookie_t var


如果你有

1
2
3
typedef struct structname {
   ..
} typename;

您可以编写此命令来声明变量a

1
struct structname a;

1
typename a;

如果你有

1
2
3
typedef struct {
   ..
} typename;

您只能编写此命令来声明变量a

1
typename a;