繁体   English   中英

为什么结构中不可能有 static 成员?

[英]why is not possible to have static members in struct?

首先,从这里:

static struct foo1 { //private struct, just for this file
    int a;
};

int main (void) {
    struct foo1 a = {10};
    return 0;
}

问题编号 1

我会收到警告:

warning: useless storage class specifier in empty declaration
 };

这是什么意思? 为什么static “无用存储 class 说明符”? 在其他情况下(function 或全局 static 中的静态局部变量,我想申请 struct foo1 ,它会起作用)。

问题2

#include <stdbool.h>
static struct s_t{ //private struct (for this file only) 
    static bool is_there = false; // defaul (pre-defined) value for all instances
    int value;
};

int main (void) {}

为什么不可能有 static,c 中所有struct s_t类型的变量的预定义值? 我只是想模拟与 function static local var -> 在多个调用中保留值相同的功能,从这个意义上说,我希望有一个成员( bool is_there在这种情况下)在每个struct foo1类型的 var 中保留值(它的实例)。 那么为什么不可能呢?

问题3

另外,有人可以从中解释错误(在更一般的意义上):

error: expected specifier-qualifier-list before ‘static’

编辑:从评论中,我不太了解存储 class 的概念,我只从 asm 知道,有data/text/bss segments ,所以这是否意味着static var的地址在 ZCD69BZ4957F08CD8181 的read-only部分? 或者说asm相关的c中storage class是什么概念?

因为 struct 类似于类型或 object,所以当您在 C 中声明 static 成员时,它会像:

static int a = 0;

在这种情况下,“int”就像你声明的结构类型,所以如果你想创建一个结构 static 成员,只需这样做:

static s_t a;
  1. 因为static struct foo1 {...只是一个结构定义,而不是一个变量。 您应该在声明结构实例时添加static 我更喜欢这种风格:

     typedef struct { int a; }foo_t; static foo_t a = {10};
  2. 因为 C 根本没有像 C++ 那样的 static 成员变量。 在 C 中,将存储或类型说明符添加到单个结构成员是毫无用处的。 而是将其放在分配的变量上。

  3. TL; DR 这对您的语法没有任何意义,因为您不能在那里拥有static 除非您对语言语法非常感兴趣,否则别无他法。

    static存储类说明符const等是类型限定符int等是类型说明符 术语说明符限定符列表来自结构的正式 C 语法,除非您正在制作编译器,否则阅读它并不是很有趣。 声明结构成员时,您有两个选项(C17 6.7.2.1):

     specifier-qualifier-list: type-specifier specifier-qualifier-list(opt) type-qualifier specifier-qualifier-list(opt)

    static不符合存储类说明符的要求,所以编译器说“什么,这不是我希望找到的说明符限定符列表?它在哪里?”

    (是的,它是递归的,因此您可以拥有多个类型说明符或类型限定符,例如const long const const int value; 。因为 C 代表疯狂。)

 static struct foo1 { //private struct, just for this file int a; };

static声明说明符仅适用于 object 或 function 声明,不适用于类型定义。 您在该语句中所做的只是创建struct foo1类型。 你有没有写过类似的东西

static struct foo1 {
  int a;
} foo;

然后object foo将被声明为static

如果您在.c文件中声明该类型,则它将仅在该.c文件中可见。 使该类型对多个.c文件可见的唯一方法是在 header 中声明它,并在每个需要它的文件中#include header。

为什么不可能有 static,c 中所有struct s_t类型的变量的预定义值?

因为 C struct类型根本没有那么复杂 - 它们只是定义具有多个属性的数据项的一种方式。 该语言没有提供任何方法来拥有在该类型的所有实例中通用的成员。

请记住,C 是 1970 年代初期的产品,最初是为实现 Unix 操作系统而开发的 - 它被设计为小巧、便携和快速。 在过去的 40 多年里,它已经添加了很多东西,但并没有真正改变该语言的核心理念。

好吧,很明显你会收到警告。 原因很简单! 您正在尝试将 Storage Class 分配给struct定义 但是,存储类适用于变量声明。 因此,您得到了提示。 如果您仍然希望使用static存储 class,那么您可以使用任何变量,最好是结构的任何实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM