首先,从这里开始:
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相关的概念是什么?
答案 0 :(得分:3)
因为struct就像类型或对象,所以当您在C中声明静态成员时,它就像:
static int a = 0;
在这种情况下,“ int”就像您声明的结构类型,因此,如果要创建结构静态成员,请执行以下操作:
static s_t a;
答案 1 :(得分:3)
因为static struct foo1 { ...
只是一个结构定义,而不是变量。声明结构实例时,应添加static
。我更喜欢这种风格:
typedef struct {
int a;
}foo_t;
static foo_t a = {10};
因为C根本没有像C ++那样具有静态成员变量。在C语言中,将存储或类型说明符添加到单个struct成员几乎没有用。将其放在分配的变量上。
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
存储类,则可以使用任何变量,最好是结构的任何实例。