为什么在结构中不能有静态成员?

时间:2020-05-27 15:08:24

标签: c struct static

首先,从这里开始:

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是“无用的存储类说明符”?在其他情况下(函数中的静态局部var或全局静态,我想申请结构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) {}

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

问题编号3

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

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

编辑: 从注释中,我不是很了解存储类的概念,仅从asm知道存在data/text/bss segments,这是否意味着static var在内存的read-only部分中有地址?还是c中storage class与asm相关的概念是什么?

4 个答案:

答案 0 :(得分:3)

因为struct就像类型或对象,所以当您在C中声明静态成员时,它就像:

static int a = 0;

在这种情况下,“ int”就像您声明的结构类型,因此,如果要创建结构静态成员,请执行以下操作:

static s_t a;

答案 1 :(得分:3)

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

    typedef struct  { 
        int a;
    }foo_t;
    
    static foo_t a = {10};
    
  2. 因为C根本没有像C ++那样具有静态成员变量。在C语言中,将存储或类型说明符添加到单个struct成员几乎没有用。将其放在分配的变量上。

  3. TL; DR,因为您在那里没有static,所以语法没有任何意义。除非您对语言语法特别感兴趣,否则别无其他。

    static存储类说明符,而const等是类型限定符,而int等是类型说明符。术语 specifier-qualifier list 来自结构的正式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代表Crazy。)

答案 2 :(得分:2)

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

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

static struct foo1 {
  int a;
} foo;

然后将对象 foo声明为static

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

为什么c中所有类型struct s_t的var都不能具有静态的预定义值?

因为C struct类型不是那么复杂-它们只是定义具有多个属性的数据项的一种方式。该语言不提供任何方式来使类型的所有实例之间具有共同的成员。

请记住,C是1970年代初的产品,最初是为实现Unix操作系统而开发的-它的设计旨在使其小型,轻便和快速。在过去40多年的时间里,已经为它添加了很多东西,但是并没有真正改变语言的核心哲学的东西。

答案 3 :(得分:0)

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

相关问题