c++ - 括号中的类型定义

标签 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 代码,它们可以通过编译,并带有警告(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-idclass-specifier 是一个type-specifier,因此是一个type-id,但它是一个定义类(或枚举说明符)的类说明符定义枚举的)只能出现在类声明或 using 声明中 (7.1.6p3)。这可能是因为 C++ 类可以有链接,允许它们出现在一般表达式(而不仅仅是定义)中会使这变得复杂。

关于c++ - 括号中的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20539156/

相关文章:

c - 在 ARM (SabreLIte) 上实现 AODV 时出错

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

c - 如何从函数中引用指针?

c++ - wxWidgets 中的线程

c++ - C++ pimpl中使用void指针的优缺点

windows - 如何从 TFS 构建定义输出 Windows 服务项目

oop - 为什么称为“开放(或封闭)递归?”

c - 在 C 变量定义中输入括号

c++ - 加载具有相同静态链接函数的两个共享库时使用哪个函数

c++ - _getch 返回额外的空终止符