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的角度来看,这意味着什么?
后者是具有名称的类型还是没有名称的结构?或者它不是类型,只是一个具有名称的结构?
我的困惑来自于
对于
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=""/> |
以及一个
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"/> |
但是对于
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=""/> |
但没有
1 2 | $ xmllint --format --xpath '//Typedef[@name="xcb_void_cookie_t"]' xcb.xml XPath set is empty |
这是否意味着尽管代码包含
第一个代码段定义了两种类型:
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
是的,
1 2 3 4 | struct { unsigned int sequence; } |
作为
在第一个
struct xcb_window_iterator_t var xcb_window_iterator_t var 。
在后一种情况下,该类型的变量必须声明为:
xcb_void_cookie_t var
如果你有
1 2 3 | typedef struct structname { .. } typename; |
您可以编写此命令来声明变量
1 | struct structname a; |
或
1 | typename a; |
如果你有
1 2 3 | typedef struct { .. } typename; |
您只能编写此命令来声明变量
1 | typename a; |