这种类型的可能性如何?

时间:2016-05-01 20:10:58

标签: c typedef

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;非常不寻常,可能导致混乱)?

1 个答案:

答案 0 :(得分:31)

事实证明typedef可以放在现有类型之后(除此之前)。这个小怪,现在已经过时了 * ,是由C标准&#34;捆绑&#34;的方式引起的。使用存储类说明符typedef,例如staticauto

声明的定义如下:

<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,发表了精彩的评论!