7

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

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

4

3 回答 3

10

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

static struct MyStruct s;

您不能使用静态成员定义结构类型:

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

这样做的原因是,在 C 中,结构是一种类型——声明一个类型的成员变量对于该类型的多个实例始终是同一个实例(即静态)完全是无稽之谈。在 C++ 中,结构实际上是类(它们仅在成员的默认可见范围上有所不同),而在 C++ 中,静态关键字在这种情况下表示其他含义。它意味着一个类方法——但由于 C 没有类和方法,所以这没有意义并且在 C 中是无效的。

经验教训:C++ 不是 C。

于 2012-08-27T08:49:48.600 回答
4

我有一个关于 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++ 成员相同的效果,则必须在另一个范围内声明它——在结构声明之外:

// 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++ 中一样。

于 2012-08-27T09:09:50.453 回答
4

static在 C 中意味着:

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

在 C++ 中,还有一个附加含义:

  • 静态成员变量或成员函数只能分配一次,无论分配了多少类实例。
于 2012-08-27T09:50:41.263 回答