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

Cla*_*tus 46 c c++ typedef language-lawyer

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

int typedef INT;
Run Code Online (Sandbox Code Playgroud)

它编译为gcc和clang(实例).我不太了解标准.所以我的问题是:这个标准符合吗?我可以依靠编译器来支持它吗?

Joh*_*ger 24

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

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

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


Joh*_*ode 21

TL/DR版本

是的,int typedef INT符合要求.

詹姆斯米歇尔版

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

6.7声明

语法

1     ... declaration:
        declaration-specifiers init-declarator-listopt ;
        static_assert-declaration

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

它说的是,在一个单一的声明,你可以有一个或多个序列声明符,其中每个声明说明可以是存储类说明(auto,extern,static,typedef),类型说明符(int,float,char等),类型限定符(const,restrict,volatile等),一个函数说明符(inline),或对准说明符.

各种说明符出现的顺序无关紧要; static const short int x;可以表述为int static short const x,或int short const static x等作为一个实践问题,大多数人把存储类说明第一,那么任何功能或定位符(如果需要的话),那么任何类型的预选赛,然后键入符,那么static const short int x是如何大多数人会写下那个宣言.

这种语法允许我们编写类似long doubleor long longunsigned long int等的类型.

请注意,虽然语法允许任意(且任意长)的类型说明符序列,但是有一个语义规则只允许相对较少的序列.你不能写short short short short x,例如,或long long long double y.只允许以下序列:

约束

2每个声明中的声明说明符和每个结构声明和类型名称中的说明符限定符列表中至少应给出一个类型说明符.每个类型说明符列表应为以下多个集合之一(以逗号分隔,每个项目有多个多集); 类型说明符可以按任何顺序出现,可能与其他声明说明符混合.
        - 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
        - long double _Complex
        -原子类型说明符
        -结构或联合说明符
        -枚举符
        - typedef名称

附录

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

  • 是的 - 但[C标准](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.11.5(未来的语言指示)说:"声明中声明说明符开头之外的存储类说明符是一个过时的特性.",至少原则上未来的C标准可能不允许`int typedef INT;`.随意添加到您的答案. (6认同)

Mar*_*k B 9

如果你看7.1/1你会看到这个语法decl-specifier:,它表明a type-specifiertypedef关键字落在语法的同一点,允许你在问题中交换它们(尽管从不写这样的代码,它是根本不是惯用的).

DECL说明符:

storage-class-specifier

type-specifier

function-specifier

friend

typedef
Run Code Online (Sandbox Code Playgroud)