C中静态结构的成员变量

我有一个关于C语言中静态结构的成员变量的问题。

有人说我们可以声明一个static struct ,但是在C中,struct没有像C ++中的类那样的静态成员,这是什么意思? 如果我声明一个静态结构,那么成员变量的状态是什么? 有人可以帮我吗?

请注意,静态结构本身与结构的静态成员不同。 虽然您可以声明一个静态结构变量:

 static struct MyStruct s; 

您无法使用静态成员定义结构类型:

 struct MyStruct { static int i; // <- compiler error }; 

这样做的原因是在C中,struct是一种类型 - 声明一种类型,其成员变量始终是同一个实例(即静态),对于该类型的多个实例来说简直是无意义的。 在C ++中,结构体是实际类(它们仅在成员的默认可见范围内不同),而在C ++中,静态关键字在这种情况下意味着其他东西。 它意味着一个类方法 - 但由于C没有类和方法,这没有意义,在C中无效。

获得的经验:C ++不是C.

我有一个关于C语言中静态结构的成员变量的问题。

有人说我们可以声明一个静态结构

正确/法律:

 // (global scope) static struct t_struct { int a; } THE_STATIC_VARIABLE; 

但是在C中,struct没有像C ++中的类那样的静态成员

 // (global scope) struct t_ill_struct { static int a; // << ill-formed in C, but valid in C++ }; 

这是什么意思? 如果我声明一个静态结构,那么成员变量的状态是什么? 有人可以帮我吗?

使用上面的示例,这意味着THE_STATIC_VARIABLE将具有静态存储。 以下是等效的:

一个

 // (global scope) static struct t_struct { int a; } THE_STATIC_VARIABLE; 

 // (global scope) struct t_struct { int a; }; static struct t_struct THE_STATIC_VARIABLE; 

也就是说,每个看到THE_STATIC_VARIABLE定义的翻译都会得到自己的副本。

如果想要与静态C ++成员具有相同的效果,则必须在另一个范围内声明它 - 在struct的声明之外:

 // file.h // (global scope) struct t_struct { int a; }; extern struct t_struct THE_GLOBAL_VARIABLE; // file.c struct t_struct THE_GLOBAL_VARIABLE; 

现在我们确实有一个,就像在C ++中一样。

C中的static意味着:

  • 程序中只有一个这个变量的实例。
  • 该变量应在程序执行的整个持续时间内有效。
  • 变量应在执行main()之前初始化。 如果程序员明确初始化变量,则应将其设置为此值。 否则应将其设置为零。
  • 变量(或静态函数)只能从其内部声明的范围访问。 如果在文件范围(全局)中声明,则只能在同一.c文件中访问它。

在C ++中,还有一个额外的含义:

  • 无论分配了多少个类实例,静态成员变量或成员函数都只能分配一次。