相当于:"错误:'function'的静态声明遵循非静态声明"在Visual Studio中

时间:2017-04-13 14:34:07

标签: visual-studio-2010

我已经被烧了好几次,我将extern函数更改为static,我忘了删除头文件声明。应用程序在Visual Studio中成功编译,但无法在Linux上的gcc中编译。

忘记删除函数引用(在其他C文件中)不是问题,因为这会导致链接器错误。问题是忘记删除声明。

例如:

file.h:
extern int func(void);

file.c:
int func(void)
{
}

如果我希望使其静态,为了将其范围缩小到只有file.c.我可以添加static关键字,然后忘记删除头文件中的声明:

file.h:
extern int func(void); /* forgot to delete */

file.c:
static int func(void) /* compile error in gcc ... static follows non-static */
{
}

这导致:

file.c:20: error: static declaration of ‘func’ follows non-static declaration
../include/file.h:459: error: previous declaration of ‘func’ was here

我主要在Windows上编译。我在Visual Studio 2010中没有看到警告或错误。我将很快转换到2015年或2017年。

在Visual Studio中是否有相应的警告或错误?我想把它弄错。例如,我使用下面的#pragmas将一些警告更改为错误,这些错误是gcc中的错误,但是在Visual Studio中是警告。一般来说,我希望项目的所有编译器都彼此严格:

/* warning C4027: function declared without formal parameter list */
#pragma warning(error : 4027)
/* warning C4029: declared formal parameter list different from definition */
#pragma warning(error : 4029)
/* warning C4020: 'func' : too many actual parameters */
#pragma warning(error : 4020)

2 个答案:

答案 0 :(得分:0)

我认为无法在VS中修复此问题。我可以理解测试团队想要编译没有错误的代码。

然后,作为向测试团队提交代码之前的最后一步,可以在它上面运行gcc作为最后一次检查清理编译。

答案 1 :(得分:0)

cl /Za file.c

/Za禁用特定于VC的扩展。没有它就不要离开家。

file.c
file.c(20) : error C2375: 'func' : redefinition; different linkage
        ..\include\file.h(459) : see declaration of 'func'