我已经被烧了好几次,我将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)
答案 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'