Visual studio 2010 相当于;错误:静态声明‘;功能’;遵循非静态声明“;在VisualStudio中

Visual studio 2010 相当于;错误:静态声明‘;功能’;遵循非静态声明“;在VisualStudio中,visual-studio-2010,Visual Studio 2010,我已经被烧掉了好几次,因为我把一个外部函数改成了静态函数,而我忘记了删除头文件声明。该应用程序在Visual Studio中成功编译,但在Linux上的gcc中编译失败 忘记删除函数引用(在其他C文件中)不是问题,因为这将导致链接器错误。问题是忘记删除声明 例如: file.h: extern int func(void); file.c: int func(void) { } 如果我希望使其成为静态的,以便将其范围仅限于file.c。我可以添加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上编译。我在VisualStudio2010中没有看到警告或错误。我很快就会转到2015年或2017年

VisualStudio中是否存在与此对应的警告或错误?我想把它弄错。例如,我使用了下面的#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)

我想不出在VS中解决这个问题的方法。我可以理解测试团队希望代码能够编译无误

然后,作为将代码交付给测试团队之前的最后一步,可能会对其运行gcc,作为干净编译的最后检查

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'

你是怎么被烧伤的?i、 e.当您执行此操作,然后从另一个单元调用
func
时,VS中会发生什么?抱歉,问题是它在Visual Studio中成功编译,但在gcc中编译失败。从长远来看,这不是一个问题,因为有自动的夜间构建,无论如何我都会注意到。我还可以在Linux上远程手动编译。只是我的工作站是Windows,99%的编译都在Windows上,所以这让我措手不及。我希望它能更早地失败,这样我就能更早地修复它。VS作为唯一一个广泛使用的C实现是不一致的,这有点臭名昭著,但这并不是它不一致的领域之一。该标准的所有版本都规定“如果在翻译单元中,同一标识符同时出现在内部和外部链接中,则该行为未定义。”实现没有义务发出有关未定义行为的错误或警告,它们甚至可以提供可靠的特定于实现的语义。我喜欢这个概念,但绝对没有任何东西可以编译,而且cl.exe本身也崩溃了!哦,是的,我记得Windows标头无法使用/Za编译,因为Microsoft喜欢在公共标头中使用自己的扩展。因此,如果您需要更严格的检查,则不需要winapi。