c++ - struct S { int align; 之间的区别 }; (结构关键字后的名称)和 struct { int align; } S; (结构定义后的名称)
问题描述
#include <stdio.h>
struct Header
{
unsigned long long int alignment;
};
int main(void)
{
struct Header header; // note: we can loose the 'struct' in C++
struct Header* pheader = &header;
return 0;
}
上面的程序在 C 和 C++ 中都能完美编译。
但是当我将 Header 结构更改为:
struct {
unsigned long long int alignment;
} Header;
它在 C 中失败并显示以下消息:
error: storage size of ‘Header’ isn’t known
在 C++ 中:
error: aggregate ‘main()::Header header’ has incomplete type and cannot be defined struct Header header;
K&R 编写的 C 编程语言书中的存储分配器实现中使用了类似的结构。我认为这是同一件事,但我知道事实并非如此。从那以后,我在其他地方也见过。我当然更熟悉第一个版本。第二个是什么意思,为什么它甚至存在?有什么区别?
解决方案
struct Header {};
引入了一个struct
名为Header
.
typedef struct {} Header;
引入了一个匿名结构类型,以及Header
该匿名类型的别名。
struct {} Header;
引入了匿名结构类型和以Header
匿名类型命名的变量。
当没有命名类型时Header
(最后一种情况),struct Header header;
引入一个没有主体的struct
命名类型Header
,然后尝试创建header
该类型的变量。
推荐阅读
- python - 为什么pytorch梯度是数组而不是向量?
- javascript - 使用 GraphQL 数据层在 Vue 中对数组进行切片
- r - 使用栅格计算农药的平均施用量和总施用量,但数字不相加
- asp.net-core - SelectList 不返回文本的值只返回 ID
- inno-setup - 我选择使用 Inno Setup 6.1.1 下载的文件是否必须在 [Files] 部分中?
- python - 按下时如何使网格中的图块改变颜色?
- javascript - mutationObserver 检查 textContent 是否更改
- python - 如何只得到整数而不四舍五入?
- flutter - 将字段从一个列表移动到另一个列表
- arrays - 在`O(j)`中打印元素?