我在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.为什么?
答案 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代码发出附加的信息诊断消息。