
[英]Why do enum constants but not members in struct declarations have file scope?
[英]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;
因为static struct foo1 {...
只是一个结构定义,而不是一个变量。 您应该在声明结构实例时添加static
。 我更喜欢这种风格:
typedef struct { int a; }foo_t; static foo_t a = {10};
因为 C 根本没有像 C++ 那样的 static 成员变量。 在 C 中,将存储或类型说明符添加到单个结构成员是毫无用处的。 而是将其放在分配的变量上。
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.