在this SO question我遇到了非常奇怪的typedef
:
struct Date {
int day, month, year;
} typedef date_s;
我一直看到typedef
遵循此规则':
typedef <existing> <new>;
例如:
typedef unsigned long long ull;
typedef int kph; // speed
typedef void (*alpm_cb_log)(alpm_loglevel_t, const char *, va_list);
typedef int int_t;
typedef char char_t, *char_p, (*fp)(void);
第4个来自here,第5个和第6个来自cppreference
而this就是我typedef
struct
:
typedef struct {
int a, b, c;
} data;
// and then use it
data Something;
问题是如何编写这样的typedef
?它甚至没有意义(至少对我而言)。
clang
即使使用-Wall -Wextra
也不会出现任何错误或警告。
加分问题:我应该向作者提出建议找到此代码的问题,以避免使用这样的typedef
(因为它&#39;非常不寻常,可能导致混乱)?
答案 0 :(得分:31)
事实证明typedef
可以放在现有类型之后(除此之前)。这个小怪,现在已经过时了 * ,是由C标准&#34;捆绑&#34;的方式引起的。使用存储类说明符的typedef
,例如static
和auto
:
声明的定义如下:
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}*
这意味着声明说明符可以按任何顺序出现。现在,声明说明符是
<declaration-specifier> ::= <storage-class-specifier>
| <type-specifier>
| <type-qualifier>
存储类说明符是
<storage-class-specifier> ::= auto
| register
| static
| extern
| typedef
struct
元素的声明是类型说明符。与typedef
关键字一样,它是一个声明说明符。由于声明说明符可以按任何顺序出现,因此typedef
的两个展示位置(即struct
之前和之后)都是有效且相同的。
* N1570,6.11.5:&#34;在声明中声明说明符开头之外的存储类说明符的位置是一个过时的功能。 &#34;谢谢,Keith Thompson,发表了精彩的评论!