在类型和别名之间是否符合标准的“ typedef”?

我偶然发现了一些代码,其中29449471126200620065792关键字位于类型和别名之间,例如

int typedef INT;

它以gcc和clang编译(实时示例)。 我不太会理解标准语言。 所以我的问题是:这个标准符合吗? 我可以依靠编译器来支持它吗?

Claas Bontus asked 2020-06-29T22:37:16Z
5个解决方案
24 votes

typedef关键字在C中被分类为存储类说明符,尽管该标准明确指出,这是为了方便表达形式语言语法。 尽管如此,仍然可以看到typedef可以出现在与其他任何存储类说明符(例如extern或2944951203073098098)可以出现的位置完全相同的位置。 [C2011,6.7.1 / 5]

实际上,该语法允许将存储类说明符与声明中的类型说明符,类型限定符和其他“声明说明符”混合使用。 [C2011,6.7 / 1,6.7 / 6]

因此,是的,将typedef关键字放在类型名称之后是有效的,如您的示例所示。

John Bollinger answered 2020-06-29T22:41:25Z
21 votes

TL / DR版本

是的,declaration:符合要求。

James Michener版本

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

6.7声明

句法

1:
        ;
static_assert-declaration

    :
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
int typedef INT
char
signed char
...

这表示在单个声明中可以具有一个或多个声明说明符的序列,其中每个声明说明符可以是存储类说明符(int typedef INTcharsigned charunsigned char),类型说明符(short, signed short, short int, or signed short intunsigned short, or unsigned short int、2944947332988797 等),类型限定符(unsigned, or unsigned intlong, signed long, long int, or signed long intunsigned long, or unsigned long int等),功能指定符(long long, signed long long, long long int, or)或对齐指定符。

各种说明符出现的顺序无关紧要; int typedef INT可以写为charsigned char,等等。实际上,大多数人都将存储类说明符放在第一位,然后是任何功能或对齐说明符(如果需要),然后是任何类型限定符,然后是类型说明符,因此unsigned char是 大多数人如何写该声明。

这种语法使我们能够编写int typedef INTcharsigned char等类型。

请注意,尽管语法允许类型说明符的任意(任意长)序列,但有一个语义规则仅允许相对少数。 例如,您不能编写int typedef INTchar。仅允许以下序列:

约束条件

2每个声明的声明说明符中至少应提供一个类型说明符,在每个struct声明和类型名称的specifier-qualifier列表中。 每个清单类型说明符应为以下多个集合之一(如果存在,则用逗号分隔)每个项目超过一个多集); 类型说明符可能以任何顺序出现与其他声明说明符混合在一起。
int typedef INT
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
long double _Complex
—原子类型说明符
—结构或联合说明符
—枚举说明符
— typedef名称

附录

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

John Bode answered 2020-06-29T22:40:55Z
9 votes

如果您查看7.1 / 1,将看到decl-specifier:的语法,这表明storage-class-specifier type-specifier function-specifier friend typedef typedef关键字属于语法的同一点,使您可以像问题中那样互换它们(尽管顺便说一句,不要编写类似 这个,这根本不是惯用语言)。

decl-specifier:

storage-class-specifier

type-specifier

function-specifier

friend

typedef
Mark B answered 2020-06-29T22:41:49Z
0 votes

我编译使用:

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

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

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

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

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

因此,发布的语法在标准之内,但可能会使读者感到困惑。

user3629249 answered 2020-06-29T22:42:31Z
-2 votes
typedef int INT

使用typedef的正确方法

无论您在哪里使用INT,它将被int数据类型替换

主要目的是仅将长数据字符串转换为简单值,但在这种情况下,您可以使用常规int本身

您可以仅出于测试目的进行中继使用调试,您可以很好地理解

Vinayagam.D answered 2020-06-29T22:43:05Z
translate from https://stackoverflow.com:/questions/35228738/is-typedef-in-between-the-type-and-the-alias-standard-conformant