C 编程语言书籍提到以下:
在看到结构的完整声明之前,不可能声明结构的新对象。例如:
struct No_good {
No_good member; // error : recursive definition
};
这是一个错误,因为编译器无法确定no_good的大小。
但下面的代码正在为我编译。
struct No_good {
static No_good member; // OK: compiling
};
static
如何允许编译器知道member
的大小。afaik静态决定命名变量的存储类别。
您在No_good
类内无法拥有完整的No_good
成员的原因,正如Francois Moisan指出的那样,是因为它会是无限的递归并占用无限的空间。
No_good*
成员会没事
静态成员也可以,因为它并未在No_good
的每个实例中存储,而是由所有实例共享。从技术上讲,它不是对象的一部分,而是与No_good
的名称空间相关的东西。
希望这能清除。
您可以将静态变量视为全局变量。唯一的区别是它在班级的名称空间下。因此,如果它是一个全局变量,则可以像no_good一样达到它,但是如果它是静态的,则必须键入no_good :: no_good。您也可以做到这一点,即使您永远不会实例化班级。
与静态有关的Globals可能会遇到的麻烦。您永远不会知道哪种静态变量首先初始化,如果它们彼此依赖,您仍然遇到麻烦。
我体验它的方式,许多静态用法来自编写C 代码。