这种类型的可能性如何?

For*_*Bru 27 c typedef

这个问题中,我遇到了一个非常奇怪的问题typedef:

struct Date {
    int day, month, year;
} typedef date_s;
Run Code Online (Sandbox Code Playgroud)

我一直看到typedef遵循这个'规则':

typedef <existing> <new>;
Run Code Online (Sandbox Code Playgroud)

例如:

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);
Run Code Online (Sandbox Code Playgroud)

第四个是从这里取的,第五个和第六个来自cppreference


是我怎么会typedefstruct:

typedef struct {
    int a, b, c;
} data;

// and then use it
data Something;
Run Code Online (Sandbox Code Playgroud)

问题是这怎么可能写这样的typedef?它甚至没有意义(至少对我而言).

clang即使有,也不会给出任何错误或警告-Wall -Wextra.

奖金问题:我应该向问题的作者提出建议,可以找到这个代码以避免使用这样的代码typedef(因为它非常不寻常并且可能导致混淆)?

das*_*ght 31

事实证明,typedef可以放在现有类型之后(除此之前).这个小古怪,现在过时*,通过的方式造成其中C标准的"束" typedefs的存储类说明符,如staticauto:

声明定义如下:

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}*
Run Code Online (Sandbox Code Playgroud)

这意味着声明说明符可以按任何顺序出现.现在,声明说明符

<declaration-specifier> ::= <storage-class-specifier>
                          | <type-specifier>
                          | <type-qualifier>
Run Code Online (Sandbox Code Playgroud)

存储类说明符

<storage-class-specifier> ::= auto
                        | register
                        | static
                        | extern
                        | typedef
Run Code Online (Sandbox Code Playgroud)

struct's元素的声明是一个类型说明符.与typedef关键字一样,它是一个声明说明符.由于声明说明符可以按任何顺序出现,因此两个位置typedef(即,之前和之后struct)都是有效的并且彼此相同.

* N1570,6.11.5:"在声明中声明说明符开头之外的存储类说明符的放置是一个过时的功能." 谢谢,基思汤普森,一个伟大的评论!

  • [N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.11.5:"存储类说明符的位置不是在开头的声明中的声明说明符是一个过时的功能." 它仍然完全合法,但该语言的未来版本可能会使其成为非法. (10认同)