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

Sla*_*eek 5 c structure

#include<stdio.h>
struct str 
{ 
   static int a ;
    int b ;
 } s ;
int main()
{
static int p , k ;
printf("%d %d",sizeof(p),sizeof(s));
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 6

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

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

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

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

  • 实际上,我不太确定它是没有意义的,虽然我不是那么傲慢,但是你仍然可以通过使用`sa`的语法糖获得结构级静态,其中`s`是`struct str`的​​_instance_,即使不使用`::`变量 - 我认为C++已经允许这样做了.这将为您提供每个类型的性质,而不是每个实例一个.我可以看到这是有用的. (2认同)

Ker*_* SB 0

只是语言不允许。除了它不是设计的一部分之外,没有其他更深层次的原因。您始终可以使用单独的全局变量来实现相同的行为,如下所示:

struct str
{
    int b;
} s;

int str_a;
Run Code Online (Sandbox Code Playgroud)

请注意,在结构中使用静态将是完全不同的事情,它将是类型的每个对象的不同子元素。int a;struct str

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