【问题标题】:extern struct forward declaration外部结构前向声明
【发布时间】:2018-11-06 12:27:50
【问题描述】:

我正在尝试编译一些包含 C 和 C++ 混合的旧代码。我发现了以下语法:

extern struct Edge;
typedef struct Edge
{
    ...
    Edge* edges;
    ...
} Edge;

当我尝试使用 GCC 编译时出现错误:

a storage class can only be specified for objects and functions extern struct Edge;

删除 extern 后,它会编译。我可能弄错了,但在我看来它确实像 Edge 的前向声明,但为什么 struct 的前面有一个 extern 关键字?

【问题讨论】:

  • struct Edge* edges; - 代码随后编译为 C,但带有警告。
  • extern struct Edge; 行是外部声明的开始,但它不包含“声明符”——没有实际对象的名称。因此,正如消息所示,这是毫无意义的。删除它是安全的;据我所知,这从来都不是必要的(甚至是有益的),而且现在肯定既不是必要的也不是有益的。

标签: c++ c gcc


【解决方案1】:

我安装并测试了其他最流行的编译器。上述代码:

  • 不使用 GCC-7.3.0 编译并产生以下 error:

main.cpp:1:1: error: a storage class can only be specified for objects and functions extern struct Edge; ^~~~~~

  • 使用clang-6.0 编译并生成以下warning

main.cpp:1:1: warning: 'extern' is not permitted on a declaration of a type [-Wmissing-declarations] extern struct Edge;

  • 使用Visual Studio 2017 编译并生成以下warning

warning C4091: 'extern ': ignored on left of 'Edge' when no variable is declared

【讨论】:

    【解决方案2】:

    在 C 中,extern struct S; 有效但无用:它与 struct S; 的含义完全相同。在 extern struct S a, b, c, ...; 中,extern 适用于 abc,...不管声明了多少个变量,即使声明了零个变量。

    在 C++ 中,extern struct S; 无效。为了与 C 兼容,大多数 C++ 编译器都允许它作为扩展,但 GCC 不允许。删除 extern 关键字是对的。

    有可能最初编写的代码extern struct S s;被拆分为struct Ss的单独声明,而extern被不小心留下了。由于编译器不介意,所以作者没有注意到.

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多