结构的构件是否允许是静态的? #包括 结构str { 静态int a; int b; }s; int main() { 静态int p,k; printf(“%d%d”,sizeof(p),sizeof(s)); getchar(); 返回0; }

结构的构件是否允许是静态的? #包括 结构str { 静态int a; int b; }s; int main() { 静态int p,k; printf(“%d%d”,sizeof(p),sizeof(s)); getchar(); 返回0; },c,structure,C,Structure,上面的代码给出了错误。但是,如果我将结构的第一个成员重新定义为“int”而不是“static int”,那么它运行良好。为什么结构中不允许使用静态成员?其意义是什么?语言就是不允许使用静态成员。除了它不是设计的一部分之外,没有更深层次的原因。使用单独的全局变量始终可以实现相同的行为,如下所示: #include<stdio.h> struct str { static int a ; int b ; } s ; int main() { static int p

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

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

#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;
}
注意,使用非静态的
inta是完全不同的在您的结构中,它将是
struct str
类型的每个对象的不同子元素


(注意,在C++中,C语言生成的语言,静态类成员确实存在,并且行为与上述描述的工作方式完全相同,只是全局变量的名称与类的名称紧密相关)。

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


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

C语言中根本没有这样的功能。在C语言中,这种特性并没有有意义的概念框架

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

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


形式上讲,C++中可以这样做,即完全忽略C++语言的这种特征,而使用全局函数和变量来代替类内的静态函数和变量。但是,这样做会放弃C++的所有成员访问控制特性。这些功能确实值得拥有。C语言没有访问控制特性,这意味着C++中的一个丢失(几乎没有)。 如果你想在C中做类似的事情,你有几个选择(可能还有更多,我现在想不出来)

第一种方法是使用如下内容分解公共变量:

struct str
{
    int b;
} s;

int str_a;
这样,结构的所有实例只共享了
a
的一个副本-每个实例仍然拥有自己的
b
副本

对此的一个轻微修改是引入一个指向该公共变量的指针并初始化该指针:

int struct_str_static_a;
struct str {
    int b;
} s;
然后,您可以使用
*(s.pA)
在以前使用
s.a
的地方。因为
struct str
的每个实例都有自己的
pA
指针,指向一个
a
,这给了您类似的效果。然而,这是一条艰难的道路


第三种选择是让自己加入下一个ISO C工作组,并将其作为语言的一种变化提出。然而,在未来十年左右的时间里,这需要你自己付出相当多的努力,可能不值得这样做:-)

你在这里有很好的答案:


一般来说,声明静态是没有任何好处的,但是如果你仍然希望它,你可以迁移到C++或者声明整个结构为静态。

结构内的静态成员将限制它的范围,但是通常静态成员必须共享(基于它的范围)因此我们不能在struct中使用它。C不是面向对象的语言。因此,将C结构定义为“静态”是没有意义的。静态意味着可以在类上调用方法,而无需实例化对象。想想数学,这里是tan(θ)。为什么我要实例化一个数学对象?我可以在数学课上调用statictan方法,得到我的一次性答案。我从未对您正在使用的w/e编译器或gcc(c++)中甚至不允许使用结构进行过太多的讨论。请放心,提供的答案是为什么。重新思考你的问题,或者移动到C++上。@ Dale,C++中的静态不限于方法,也适用于数据。我能想到一些情况,每种类型的变量有一个副本是有意义的,它仍然是变量本身的一部分。我可以看到math::PI在做这件事。我想说的是,在面向对象的范例之外,静态是没有意义的。一个不实例化C结构,一个只调用C结构。我想说的是,一个不在堆上分配内存,但那是胡说。我生锈了。说实话,现在我想起来了,我很难用一种不同的方式来推理一个C结构,而不是C++对象。实际上,我不确定它是没有意义的,虽然我不是那么傲慢,因为它会降低它:-你仍然可以得到STR。
int struct_str_static_a;
struct str {
    int *pA;
    int b;
} s;
:
s.pA = &struct_str_static_a;