我在 MSVC 中编译了这些代码:
int a=sizeof(struct{char c;});
和
int b=((struct{char c;} *)0,0);
和
printf("%p",(struct{char c;} *)0);
作为 C 代码,它们可以通过编译,并带有警告(warning c4116: unnamed type definition in the parentheses。如果你给一个名字,它是 "warning c4115: "Whatever":括号中的命名类型定义");
作为 C++ 代码,它们在编译时出现了一堆错误。
我的问题是:
1.在C语言中,括号中的类型定义是否有效?为什么我会收到该警告?
2. C++中,括号中的类型定义是否有效?
编辑:
3. 为什么?
最佳答案
在 C 中,sizeof
可以应用于任何不是不完整类型的 type-name (6.5.3.4p1);包含结构声明列表 (6.7.2.1p1) 的 struct-or-union-specifier 是一个type-specifier,因此是一个type-name。 MSVC 的警告有两个原因:首先,因为一些较旧的编译器(或用作 C 编译器的 C++ 编译器)可能不支持这种用法,其次,因为它不常见并且可能不是您想要的。
在 C++ 中,sizeof
可以应用于 type-id; class-specifier 是一个type-specifier,因此是一个type-id,但它是一个定义类(或枚举说明符)的类说明符定义枚举的)只能出现在类声明或 using
声明中 (7.1.6p3)。这可能是因为 C++ 类可以有链接,允许它们出现在一般表达式(而不仅仅是定义)中会使这变得复杂。
关于c++ - 括号中的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20539156/