extern struct forward declaration

时间:2018-05-27 23:31:11

标签: c++ c gcc

我正在尝试编译一些包含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的前向声明,但为什么在extern前面有一个struct关键字?

2 个答案:

答案 0 :(得分:4)

在C中,extern struct S;有效但无用:它与struct S;完全相同,extern struct S a, b, c, ...;extern适用于a,{ {1}},b,...无论声明了多少变量,即使声明零变量也是如此。

在C ++中,c无效。为了与C兼容,大多数C ++编译器允许它作为扩展,但GCC没有。您只需删除extern struct S;关键字即可。

最初编写的代码extern可能会被分割为extern struct S s;struct S的单独声明,并且s被意外遗漏。自从编者并不介意,作者没有注意到。

答案 1 :(得分:0)

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

  • 不会使用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