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

时间:2016-02-05 16:17:30

标签: c++ c language-lawyer typedef

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

int typedef INT;

它在gcc和clang(live example)中编译。我不太了解标准。所以我的问题是:这个标准符合吗?我可以依赖编译器来支持它吗?

5 个答案:

答案 0 :(得分:24)

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

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

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

答案 1 :(得分:21)

TL / DR版

是的,int typedef INT符合要求。

James Michener版本

C声明语法(C 2011 online draft):

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,{{ 1}},externstatic),类型说明符(typedefintfloat等),类型限定符({{1 },charconst等),函数说明符(restrict)或对齐说明符。

各种说明符出现的顺序无关紧要; volatile可以写成inlinestatic const short int x;等。实际上,大多数人首先使用存储类说明符,然后是任何函数或对齐说明符(如果需要),然后是任何类型限定符,然后是类型说明符,因此int static short const x大多数人将如何编写该声明。

此语法允许我们编写int short const static xstatic const short int xlong double等类型。

请注意,虽然语法允许任意(且任意长)的类型说明符序列,但是有一个只允许相对较少的语义规则。例如,您无法编写long longunsigned long int。只允许以下序列:

约束

2每个声明中的声明说明符中至少应给出一个类型说明符, 并在每个结构声明和类型名称的说明符限定符列表中。每个清单 类型说明符应该是以下多个集合之一(由逗号分隔,在那里 每个项目超过一个多个集合);类型说明符可能以任何顺序出现 与其他声明说明符混合。
- short short short short x
- long long long double y
- 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
- 原子类型说明符
- 结构或联合说明符
- 枚举说明符
- typedef名称

<强>附录

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

答案 2 :(得分:9)

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

  

DECL说明符:

storage-class-specifier

type-specifier

function-specifier

friend

typedef

答案 3 :(得分:0)

我使用编译:

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

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

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

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

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

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

答案 4 :(得分:-2)

response.success = { resp, reader ->
    def stream
    reader.each { key, value ->
        stream = key
    }
    stream
}
  

RightWay使用typedef

     

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

     

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

     

您可以继续上传仅用于测试目的使用调试,您可以很好地理解