C ++中结构名称的可用性
Availability of name of a structure in C++
考虑以下两个代码片段(按顺序 A 和 B):
struct abc {
int a {};
abc* next;
};
和
struct abc {
int a {};
abc next;
};
事实是:
1. 代码段 A 有效。
2. 代码段 B 无效。
参数:
B 无效,因为编译器在声明时无法确定片段 B 中 abc 的大小。 (Stroustrup,C++ 编程语言,8.2.2)
我的疑问:
代码段A编译的时候不是需要abc
的大小吗?声明指向abc
的指针时是否不需要abc
的大小?否则在编译期间,编译器如何知道如何取消引用 abc*
?
C++ 区分声明和用法。要 声明 一个指针,不需要知道指针类型的大小。但是,引用指针的代码确实需要知道它的大小。
在您的第二个示例中,您有一个 class 包含相同 class 的实例,它将递归地包含相同 class.
的实例
由于 C++ 中的每个对象的大小都必须至少为 1,这意味着 class abc
的任何实例都将是无限的 (1+1+1+...)。
第一个例子不是问题,因为指向任何对象的指针的大小都是常数,因此 abc
的大小是有限的,创建这样一个对象可以在不创建无限对象的情况下完成(指针可以指向 nullptr
或现有对象)。
使用指针算法或使用 [] 运算符进行引用时,需要变量的大小。
在编译时声明指向它的指针时不需要引用对象的大小。
代码段 B 的问题在于它不仅包含指向另一个 abc 的指针,它还包含整个 abc 的内存分配。反过来,它包含一个完整的 abc。其中包含整个 abc。其中包含整个 abc。看到我们要去哪里了吗?
代码段A没有这个问题;它只是存储一个固定大小的指针。该指针可能指向另一个有效的 abc,但它也可以指向 null、它本身、内存中的随机点或其他任何东西。
考虑以下两个代码片段(按顺序 A 和 B):
struct abc {
int a {};
abc* next;
};
和
struct abc {
int a {};
abc next;
};
事实是:
1. 代码段 A 有效。
2. 代码段 B 无效。
参数:
B 无效,因为编译器在声明时无法确定片段 B 中 abc 的大小。 (Stroustrup,C++ 编程语言,8.2.2)
我的疑问:
代码段A编译的时候不是需要abc
的大小吗?声明指向abc
的指针时是否不需要abc
的大小?否则在编译期间,编译器如何知道如何取消引用 abc*
?
C++ 区分声明和用法。要 声明 一个指针,不需要知道指针类型的大小。但是,引用指针的代码确实需要知道它的大小。
在您的第二个示例中,您有一个 class 包含相同 class 的实例,它将递归地包含相同 class.
的实例由于 C++ 中的每个对象的大小都必须至少为 1,这意味着 class abc
的任何实例都将是无限的 (1+1+1+...)。
第一个例子不是问题,因为指向任何对象的指针的大小都是常数,因此 abc
的大小是有限的,创建这样一个对象可以在不创建无限对象的情况下完成(指针可以指向 nullptr
或现有对象)。
使用指针算法或使用 [] 运算符进行引用时,需要变量的大小。
在编译时声明指向它的指针时不需要引用对象的大小。
代码段 B 的问题在于它不仅包含指向另一个 abc 的指针,它还包含整个 abc 的内存分配。反过来,它包含一个完整的 abc。其中包含整个 abc。其中包含整个 abc。看到我们要去哪里了吗?
代码段A没有这个问题;它只是存储一个固定大小的指针。该指针可能指向另一个有效的 abc,但它也可以指向 null、它本身、内存中的随机点或其他任何东西。