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

时间:2012-08-08 06:15:58

标签: 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;
}

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

5 个答案:

答案 0 :(得分:6)

C语言中没有这样的功能。对于C中的此类功能,没有有意义的概念框架。

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

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

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

答案 1 :(得分:0)

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

struct str
{
    int b;
} s;

int str_a;

请注意,在您的struct中包含 -static int a;会有所不同,这将是每个对象的不同子元素输入struct str

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

首先是用以下内容打破公共变量:

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

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

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

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

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

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

答案 4 :(得分:0)

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

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