结构的成员是否允许静态?

#include struct str { static int a ; int b ; } s ; int main() { static int p , k ; printf("%d %d",sizeof(p),sizeof(s)); getchar(); return 0; } 

上面的代码给出了错误。 但是,如果我将结构的第一个成员重新定义为’int’而不是’static int’,那么它运行正常。 为什么静态成员不允许进入结构中,它的意义何在?

在C语言中根本没有这样的function。 并且在C中没有有意义的概念框架。

您可以看到,在C ++术语中, static成员变量和普通全局变量之间只有一个相关区别:声明其名称的范围和相应的命名语法。 全局变量可以被称为a ,而类的静态成员将被称为SomeClass::a 。 除了范围命名之外,没有其他区别。 (我故意忽略其他C ++特有的function,比如访问控制,因为它们在C中不存在,而这个问题实际上是关于C.)

在C语言中,结构类型不会引入自己的范围。 在C语言中没有SomeStruct::a这样的命名语法。 因此,没有理由在结构中使用静态成员。 您可以改为声明全局变量并实现相同的效果。 调用全局变量str_a以传达将其与struct str “关联”的意图,并将该变量视为struct str的伪静态成员。

从forms上讲,人们可以在C ++中以相同的方式完成它,即完全忽略C ++语言的这一特性,并使用全局函数和变量而不是类中的静态函数和变量。 但是,通过这样做,将放弃C ++的所有成员访问控制function。 这些function非常值得拥有。 C语言没有访问控制function,这意味着在C语言中几乎没有任何东西丢失。

语言不允许它。 没有更深层次的理由,除了它不是设计的一部分。 您总是可以使用单独的全局变量实现相同的行为,如下所示:

 struct str { int b; } s; int str_a; 

请注意,拥有静态int a;会有所不同int a; 在你的struct中,它将是struct str类型的每个对象的不同子元素。

(另请注意,在C ++中,一种从C演变而来的语言,静态类成员确实存在并且行为与我上面描述的解决方法完全相同,只是全局变量的名称与类的名称紧密关联。)

静态修饰符用于在文件的全局作用域中声明变量,函数中的静态修饰符创建一个变量,其持久值仅限于此函数的作用域。 并且您不能在结构的实例之间共享此整数的值。 这不是也不能在C中支持;)

为什么要在结构中使用静态成员? 也许有(必须)更好的解决方案。

你在这里有很好的答案: http : //cboard.cprogramming.com/c-programming/123691-static-variable-structure.html

一般来说,你没有从声明静态获得任何收益,但如果你仍然希望它,你可以迁移到c ++或声明整个结构为静态。

不,不在C中。我相信C ++可以做到这一点,这意味着在struct str结构的所有实例之间共享一个副本。

如果你想在C中做类似的事情,你有几个选择(可能还有更多,我现在无法想到它们)。

第一个是通过以下方式打破公共变量:

 int struct_str_static_a; struct str { int b; } s; 

这样,结构的所有实例只共享一个副本 – 每个实例仍然获得自己的b副本。

稍微修改一下就是引入一个指向该公共变量的指针并初始化指针:

 int struct_str_static_a; struct str { int *pA; int b; } s; : s.pA = &struct_str_static_a; 

然后你可以在使用sa之前使用*(s.pA) 。 因为struct str每个实例都有自己的pA指针,指向单个a ,这会产生类似的效果。 但是,这是一条曲折的道路。

第三种选择是让自己进入下一个ISO C工作组,并将其作为对语言的更改。 然而,在接下来的十年左右,这将需要你自己的一些努力,可能不值得努力:-)