【问题标题】:C Language - struct declaration and inner static membersC 语言 - 结构声明和内部静态成员
【发布时间】:2018-05-31 13:38:41
【问题描述】:

我在一本技术书籍中找到了以下示例

struct {
    tBoolean logON;
    static enum eLogLevel outputLevel[NUM_LOG_SUBSYSTEM];
} sLogStruct;
static struct sLogStruct gLogData;

但我对 struct 声明的优点感到困惑,从形式上讲,它应该是

struct name {
    ...
}

事实上,我做了一些尝试,编译器在语句中出现错误(我真的尝试过使用标准类型,而不是像 sLogStruct 这样的东西)

static struct sLogStruct gLogData;

我的怀疑是对的,代码有问题吗?

此外,我想了解结构中 static 类存储的含义和范围,因为我没有找到任何令人满意的解释。让我们有一个这样的结构声明

struct myStruct {
    int Foo;
    static int sFoo;
} strA, strB;

strAstrB 是否有两个相互独立的静态变量?

【问题讨论】:

  • 你不能在 C 中将结构成员声明为静态的。
  • 看来这本书真的很烂。
  • 你确定这本书使用的是 C 而不是 C++?
  • @Someprogrammerdude: Anonymous struct 保留用于在另一个未命名结构 中的情况。
  • @Acorn 为什么只为嵌套结构保留它们?您可以使用它在任何地方定义任何结构变量,就像任何其他变量一样。

标签: c struct static


【解决方案1】:

我的怀疑是对的,代码有问题吗?

是的,不知何故代码有问题。

让我们仔细看看:

struct {
  tBoolean logON;
  static enum eLogLevel outputLevel[NUM_LOG_SUBSYSTEM];
} sLogStruct;

假设您在某处定义了成员的类型。

您声明一个未命名的结构类型并定义该类型的变量 sLogStruct。 没有定义没有结构标记没有类型名称

static struct sLogStruct gLogData;

由于没有类型struct sLogStruct,因此您无法定义该类型的变量。

另外我想了解结构中静态类存储的含义和范围,因为我没有找到任何令人满意的解释。

没有意义。对于 struct 成员,添加 static 关键字没有任何意义,并且是不允许的。

【讨论】:

  • 基于上面的 cmets,我认为结构声明带来了一个未命名的结构,而不是一个匿名的结构。除此之外,您的回答很有帮助!
  • @MFrancone 感谢您的提示。对我来说,这些词直到现在都是同义词。我更新了答案。
  • 直到现在我才知道匿名和未命名!试着看一下@jonathanLeffler 评论中发布的链接。第 13 段和例子很清楚。
【解决方案2】:

struct 的标签名称是可选的。

例如,以下将声明两个变量(s1s2),它们都是未命名的 struct 类型:

struct
{
    int a;
} s1, s2;

void f()
{
    s1.a = 3;
    s2.a = 5;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多