Visual C ++(即Visual Studio)是否有可能将任何不正确的extern函数原型报告为构建错误?
我有一个使用/Wall
编译的Visual Studio C项目(“启用所有警告”)和/WE
(“将警告视为错误”)。但是,如果我为现有函数定义了一个错误的extern原型,这实际上是一个运行时的灾难,它甚至不会打印信息性消息,并且程序可能会在运行时失败。
例如,如果我test.c
定义如下:
void some_function(int *x, int *y, int *z)
{
*z = *x + *y;
}
现在让我们在main.c
中说某人将“手工制作的”extern
置于错误的定义中,而不是包含test.h
:
// compiles fine with /wall /e, no warnings or messages
extern void some_function(int *x);
int main(void)
{
int x = 5;
some_function(&x); // <- write access violation in runtime
return 0;
}
显然,在外部编译单元中包含的头文件之外写一个extern
定义是一个坏主意,并且可能有一个用例,更改原型会让某人获利,但我如果Visual Studio会迫使我围绕这样的代码编写#pragma
,那会更快乐。同时,使用/wall /we
使“C4710 printf
没有内联”完全成熟的构建错误。
当然,请注意,如果写在同一个文件中,这会立即失败:
void some_function(int *x);
// Warning C4029: declared formal parameter list different from definition
void some_function(int *x, int *y, int *z)
{
*z = *x + *y;
}
有没有办法防止Visual Studio中出现这些错误(显然除了遵守编码标准)?
答案 0 :(得分:3)
在 C (不是C ++)中,链接器对参数类型一无所知,因为名称没有被修改,所有some_function()
都是相同的,无论参数如何。
由于您正在使用Visual Studio,因此获得您正在寻找的内容的一种方法是将C代码编译为C ++。这将生成错位名称,这反过来会产生链接时错误。