【发布时间】: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 我曾希望“想知道静态存储类如何(或什至是否)影响结构标签”足够接近一个问题,很抱歉造成混淆。