显示错误的C原型作为构建警告

时间:2017-03-27 16:00:45

标签: c visual-studio visual-c++

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中出现这些错误(显然除了遵守编码标准)?

1 个答案:

答案 0 :(得分:3)

C (不是C ++)中,链接器对参数类型一无所知,因为名称没有被修改,所有some_function()都是相同的,无论参数如何。

由于您正在使用Visual Studio,因此获得您正在寻找的内容的一种方法是将C代码编译为C ++。这将生成错位名称,这反过来会产生链接时错误。