结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
Difference between struct S { int align; }; (name after struct keyword) and struct { int align; } S; (name after the struct definition)
#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++ 中都能完美编译。
但是当我将标题结构更改为:
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 {};
引入了一个名为Header
的struct
类型。
typedef struct {} Header;
引入了匿名结构类型,以及该匿名类型的别名Header
。
struct {} Header;
引入了匿名结构类型和名为匿名类型的Header
变量。
当没有名为Header
的类型(最后一种情况(时,struct Header header;
引入一个名为Header
的不带主体的struct
类型,然后尝试创建该类型的变量header
。
当你编译下面的部分时
struct {
unsigned long long int alignment;
} Header;
struct
没有标记,则称为匿名结构类型。
struct Header header;
编译器产生类似
标头标头"的类型不完整,无法定义结构标头 页眉
因此,在这些情况下,最好typedef
struct
。例如
typedef struct {
unsigned long long int alignment;
} Header;
简单来说,编译器看到的是"Header",并且没有以前或内置的数据类型"Header",所以它不知道它是什么。当您使用
typedef struct header {
....
} Header;
编译器可以说嘿,用户告诉我一个定义的数据类型,现在我可以稍后在代码中引用一些东西。
- 为什么在全局范围内使用"extern int a"似乎不行?
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- int(c) 和 c-'0' 之间的区别。C++
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 对类似"struct {double, int}"对象使用reinterpret_cast进行对象访问
- C++ 在"struct std::iterator_traits"中没有名为"value_type"的类型<int>
- 如何将int数组分配给linkedlist struct
- 从数组列表中的字符串迭代器获取 int dat<struct>
- std::int 和 struct 内存不足的映射 (std::Bad_alloc) c++
- 如何从采用 int 和 struct 类型的指针的函数中取消引用指针返回的地址?
- 在向量上找到第一对元素 (int) 并得到第二对元素 (struct)
- 从int到struct的强制转换出现问题
- insert(std::map<int,struct>) 分段错误(核心转储)
- std::map<struct, int> 我需要析构函数吗?
- Is struct A { int a[2] = {1, 2}; }; legal as per C++11?
- 'struct std::pair<int, int>'没有名为'serialize'的成员
- struct和int之间clang中的重新定义不一致
- 如何使用extern关键字正确初始化struct[int]