【问题标题】:C struct with file scope具有文件范围的 C 结构
【发布时间】:2020-02-18 22:38:30
【问题描述】:

问题:在文件范围内声明为 static 的结构上的 标签 是否以与声明的实际结构变量相同的方式对文件私有?还是结构标签在文件中是通用的?

这个问题来自我在使用 MSVS2019 调试器时遇到的一个问题,它在某些文件中显示了错误的值和结构成员名称。 (如果您有兴趣,可以在此处阅读有关该错误的信息:Visual Studio 2019 Debugger Issue)这些文件都是从原始文件中克隆出来的,并且都有这样的内容:

static struct MyPrivateData_s
{
   char *szData[64];
} myData;
static int myCount;

结构的实际成员因文件而异,每个文件的值也大不相同。

我知道声明为静态的变量,但在源文件中的任何函数之上都有“文件范围”——仅对该文件是全局的。我很确定 VS 调试系统有问题,但它让我想知道静态存储类如何(甚至 if)影响结构 tag

如果标签被视为结构名称和其他变量,那么它是文件私有的。但是,如果对标签进行不同的处理,则可能会触发 VS 错误。请记住,我问的是 only 结构 tag,而不是实际结构变量的名称。了解 typedef 中的名称如何受“静态”影响也是一件好事。

我一直试图在我拥有的所有各种 C 参考文献中找到答案,并且可以在线找到,但我 (a) 不知道要问的正确问题和/或 (b) 不理解 (或识别?)当我找到答案时。希望 C 大师可以帮助我。

FWIW, 认为文件范围内static 之后的任何内容都应限制在找到它的文件中。事实上,只有 below 在文件中找到它的点。这就是我一直编码的方式,在这个调试器让我对此感到疑惑之前,我从未遇到过问题。谢谢!

我认为这可能会回答我的问题:Limit Struct Scope 尽管它没有明确使用“标签”一词。相反,它似乎将标签称为“类型”,当以“结构”为前缀时,它就变成了。所以 static 没有效果,但是标签出现在 C 文件中而不是在公共头文件中的事实意味着标签是文件私有的。很抱歉打扰了。

【问题讨论】:

  • 帖子正文或标题中的句子都不是问题。要问一个问题,你实际上应该问一个问题。
  • 一开始,您会写到调试器会混淆不同对象中的值。后来,你写你只是询问标签。最后,你写了用static 声明的事物的范围。完全不清楚你在问什么。
  • @EricPostpischil 我曾希望“想知道静态存储类如何(或什至是否)影响结构标签”足够接近一个问题,很抱歉造成混淆。

标签: c scope static


【解决方案1】:

static 不影响结构标签或范围。

文件范围之外没有范围(C 2018 6.2.1 1)。不同作用域的标识符可以通过 linkage (6.2.2 1) 引用同一个对象。如果不同的作用域在不同的翻译单元中,如果标识符有外部链接,它们可以引用同一个对象。

结构标签没有链接(6.2.2 6:“以下标识符没有链接:声明为对象或函数以外的任何东西的标识符;……”)因此,不同翻译单元中的结构标签指的是不同的实体。

这意味着不同翻译单元中的结构类型是不同的类型。然后有人会想知道如何在不同的翻译单元中使用相同的结构。根据 6.2.7 1,不同翻译单元中的结构类型可能是兼容的。对于结构,兼容性在很大程度上需要相同的定义,并有一些允许,例如可能省略标签。

static 在声明中的存在(但不在 [] 内部)会影响对象和函数的链接 (6.2.2 3) 和存储持续时间 (6.2.4 3)。

这回答了这个问题:

问题:在文件范围内声明为静态的结构上的 标签 是否以与声明的实际结构变量相同的方式对文件私有?还是文件之间的结构标签是通用的?

static 既不影响结构标签也不影响范围。它影响对象和函数标识符是否可以由于链接而不是范围而跨翻译单元相关。

typedef 名称是别名。

了解 typedef 中的名称如何受“静态”影响也是一件好事。

C 2018 6.7.8 3 说“...... typedef 声明不引入新类型,只是指定类型的同义词......”如上所述,static 仅影响对象和函数;它不会影响类型或类型名称。

【讨论】:

  • 我认为作者只是想要一些文档,说明当您同时尝试声明和定义时会发生什么语言勘误表。一般来说,我发现block-stmt 用于强制语言具有真正的编程特定效果,程序员可以轻松地得到结果。
  • 这个答案是我希望得到的。现在我有一些可验证的事实可以使用,以防微软试图声称他们的调试器中没有错误,而我的问题是由我的代码引起的。谢谢!
【解决方案2】:

试试这个:

struct _myprivdata_s_ {
    char *szData[64];
};
typedef struct _myprivdata_s_ MyPrivateData_s;
static MyPrivateData_s myData;
static int myCount;

【讨论】:

  • 这个答案没有解释。它是否利用了标准规定的 C 语义的某些方面?它是否解决了编译器/调试器错误?还有什么?它应该完成什么?它涉及问题中提到的哪些问题?
  • 问题似乎源于在声明语句中使用staticstruct。这种选择并不总是具有程序员所期望的效果。 ——CW
  • 什么问题?有什么作用?这个答案如何解决它?
  • 你可以试试这个链接@[ideone.com/8p8dBm]告诉我这是否是原发帖人所说的要解决的问题......
  • @C.R.Ward 我不确定 C++ 示例如何回答 C 问题。另外,我的实际问题是当多个文件对静态结构使用相同的标签时 struct 标签的可见性。我试图澄清我帖子顶部的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2015-07-06
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多