我正在尝试编译一些包含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
关键字?
答案 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)
我安装并测试了其他最受欢迎的编译器。上述代码:
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