【问题标题】:Why is static struct allowed by the compiler?为什么编译器允许静态结构?
【发布时间】:2021-02-23 11:17:46
【问题描述】:

根据this questions's answer,C++ 中没有static struct 这样的东西。但是我正在重构代码:

static struct _MyStruct
{
 int x;
}MyStruct;

结果意外地:

static struct _MyStruct
{
 int x;
};

static _MyStruct MyStruct;

我很惊讶地发现它可以编译(VS2019,C++17),并且根据我的经验,编译器不允许你添加没有意义的关键字 - 所以 确实 它做任何事情或者是出于兼容性原因留在那里?

【问题讨论】:

  • 这可能是 MSVC 的众多特性之一。
  • gcc/clang/msvc 拒绝该代码here(如预期)。
  • 让我有点困惑的是,您链接的答案解释说对象可以是静态的(与类型相反),这就是您的代码的两个版本之间发生的变化。所以假设第一个很好,为什么不应该是第二个?
  • _Mystruct 是为实现保留的名称。被抑制的警告可能是故意的,以免在其自己的标题上发出警告。在您自己的代码中使用它是未定义的行为 - 缺少警告是非常良性的结果。
  • @Eljay Appears that the standard allows static there 不。

标签: c++ visual-studio


【解决方案1】:

C++ 标准说(引自最新草案):

[dcl.stc]

静态说明符只能应用于变量或函数的声明、结构化绑定声明([dcl.struct.bind])或匿名联合声明([class.union.anon] )。

所以,后一个例子是不正确的。

编译器需要诊断格式错误的程序(除非标准另有说明)。它们不需要编译失败。编译格式错误的程序通常是一种语言扩展。

它有什么作用

有时要了解语言扩展的作用,最好的方法是阅读编译器的文档。其他时候,编译并查看编译器的内容会更简单:

<source>(4): warning C4091: 'static ': ignored on left of '_MyStruct' when no variable is declared

结论:不,它没有任何作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2014-01-29
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多