括号中的类型定义

时间:2013-12-12 09:07:03

标签: c++ c definition parentheses

我在MSVC中编译了这些代码:

int a=sizeof(struct{char c;});

int b=((struct{char c;} *)0,0);

printf("%p",(struct{char c;} *)0);

作为C代码,他们可以通过编译,并发出警告(警告c4116:括号中未命名的类型定义。如果你给出一个名字,那就是“警告c4115:”随便“:括号中的命名类型定义“);
作为C ++代码,它们被编译为一堆错误。

我的问题是:
1.在C中,括号中的类型定义是否有效?为什么我会收到警告?
2.在C ++中,括号中的类型定义是否有效?

编辑:
3.为什么?

2 个答案:

答案 0 :(得分:4)

在C中,sizeof可以应用于任何不完整类型的类型名称(6.5.3.4p1);包含结构声明列表(6.7.2.1p1)的 struct-or-union-specifier 类型说明符,因此是类型名称。 MSVC的警告有两个原因:首先,因为一些较旧的编译器(或用作C编译器的C ++编译器)可能不支持这种用法,其次,因为它不常见,可能不是你想要的。

在C ++中,sizeof可以应用于 type-id ; 类说明符类型说明符,因此是 type-id ,但是是一个定义类的类说明符(或枚举说明符)定义枚举)只能出现在类声明或using声明(7.1.6p3)中。这可能是因为C ++类可以具有链接并允许它们出现在一般表达式(而不仅仅是定义)中会使这一点复杂化。

答案 1 :(得分:2)

在C:

sizeof(struct{char c;})

sizeof((struct{char c;} *)0,0)

都是有效的表达式。实现可以免费为有效的C代码发出附加的信息诊断消息。