我偶然发现了一些代码,其中typedef
关键字位于类型和别名之间,如
int typedef INT;
它在gcc和clang(live example)中编译。我不太了解标准。所以我的问题是:这个标准符合吗?我可以依赖编译器来支持它吗?
答案 0 :(得分:24)
typedef
关键字在C中被归类为存储类说明符,但标准明确指出这是为了方便表达形式语言语法。但是,typedef
可以出现在任何其他存储类说明符(例如extern
或static
)的完全相同的位置。 [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声明
的语法强>
1declaration:
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}},extern
,static
),类型说明符(typedef
,int
,float
等),类型限定符({{1 },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 double
等类型。
请注意,虽然语法允许任意(且任意长)的类型说明符序列,但是有一个只允许相对较少的语义规则。例如,您无法编写long long
或unsigned 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-specifier
和typedef
关键字落在语法的同一点,允许你在问题中交换它们(虽然从不写这样的代码,但它根本不是惯用的。)
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本身
您可以继续上传仅用于测试目的使用调试,您可以很好地理解