是typedef之间的types和别名符合标准?

我偶然发现了typedef关键字在types和别名之间的代码

 int typedef INT; 

它在gcc和clang中编译( 现场示例 )。 我对标准的理解不是很好。 所以我的问题是:这个标准是一致的吗? 我可以依靠编译器来支持它吗?

TL / DR版本

是的, int typedef INT符合。

詹姆斯米歇尔版本

C声明语法( C 2011在线草案 ):

6.7声明

句法

1个declaration :
declaration-specifiers init-declarator-list opt ;
static_assert-declaration

declaration-specifiers :
storage-class-specifier declaration-specifiers opt
type-specifier declaration-specifiers opt
type-qualifier declaration-specifiers opt
function-specifier declaration-specifiers opt
alignment-specifier declaration-specifiers opt

这就是说,在一个声明中,可以有一个或多个声明说明符序列,其中每个声明说明符可以是存储类说明符( autoexternstatictypedef ),types说明符( intfloatchar等等),types限定符( constrestrictvolatile等),函数说明符( inline )或alignment说明符。

各种说明符出现的顺序无关紧要。 static const short int x; 可以写成int static short const xint short const static x等等。实践中,大多数人首先放置存储类说明符,然后是任何函数或alignment说明符(如果需要的话),然后是任何types限定符,然后input说明符,所以static const short int x大多数人写这个声明的方式。

这个语法允许我们写types如long doublelong longunsigned long int

请注意,虽然语法允许任意(和任意长)的types说明符序列,但是有一个语义规则只允许相对less数几个。 例如,你不能写short short short short x ,或long long long double y 。 只允许以下序列:

约束

2每个声明中的声明说明符和每个结构声明和types名称中的说明符 – 限定符列表中应至less给出一个types说明符。 types说明符的每个列表应该是以下多个集合之一(当每个项目有多个多重集时,用逗号分隔); types说明符可能以任何顺序出现,可能与其他声明说明符混合在一起。
void
char
signed char
unsigned char
short, signed short, short int, or signed short int
unsigned short, or unsigned short int
int, signed, or signed int
unsigned, or unsigned int
long, signed long, long int, or signed long int
unsigned long, or unsigned long int
long long, signed long long, long long int, or
signed long long int
unsigned long long, or unsigned long long int
float
double
long double
_Bool
float _Complex
double _Complex _ double _Complex
long double _Complex _ long double _Complex
– primefacestypes说明符
– 结构或联合说明符
– 枚举说明符
– typedef名称

附录

正如Keith在下面的评论中指出的那样,未来的语言版本可能会限制存储类指定符到声明的开头,所以int typedef INT在未来的编译器中可能不合法。

typedef关键字被分类为C中的存储类说明符,尽pipe标准明确指出这是为了方便expressionforms语言语法。 然而,它跟在typedef可以出现在完全相同的地方,任何其他存储类说明符,如externstatic ,可以出现。 [C2011,6.7.1 / 5]

实际上,该语法允许存储类说明符在声明中与types说明符,types限定符和其他“声明说明符”混合在一起。 [C2011,6.7 / 1,7.7 / 6]

因此,是的,将typedef关键字放在types名称后面是有效的,就像你的例子。

如果你看7.1 / 1,你会看到这个decl-specifier:语法decl-specifier:它显示了一个type-specifiertypedef关键字落在语法中的同一点,允许你在问题中交换它们(尽pipe作为不要写这样的代码,这根本就不是惯用的)。

DECL说明符:

 storage-class-specifier type-specifier function-specifier friend typedef 

我编译使用:

gcc -c -Wall -Wextra -pedantic -Wconversion -std = gnu99

在后台,这意味着-Wold-style-declaration被设置。

然后编译器输出以下警告消息:

 warning: 'typedef' is not a beginning of declaration [-Wold-style-declaration] 

如果没有设置该参数,编译器将毫无问题地处理语法

所以发布的语法是在标准范围内,但可能会让读者感到困惑。

 typedef int INT 

右键使用typedef

无论你使用INT,它将被int数据typesreplace

这个主要目的只是为了将长数据string转换为简单的值,但在这种情况下,您可以使用普通的int本身

你可以只为testing目的使用debugging继电器,你可以很好地理解