Visual Studio的C4028警告(形式参数与声明不同)是虚假的吗?

时间:2013-08-30 03:15:27

标签: c visual-studio-2010 c89

考虑以下函数声明和定义。在头文件中:

void some_function(int param);

在源文件中:

#include "test.h"

void some_function(const int param) {}

int main(void) {
    return 0;
}

在Visual Studio 2010下,编译为纯C项目,我看到warning C4028: formal parameter 1 different from declaration。但据我所知,这是完全有效的C,也是相当常见的做法。

我错了,VS2010是否正确警告我?或者如果它是虚假警告,我可以针对这种情况专门禁用它,但是对于不匹配的参数类型的实际情况,请保持警告吗?

(VS2010附带的实际编译器是: Microsoft(R)32位C / C ++优化编译器版本16.00.30319.01 for 80x86 。我的命令行只是cl test.c。 )

1 个答案:

答案 0 :(得分:2)

C89 3.5.4.3 Function declarators有关于参数的说法:

  

要兼容两种功能类型,两者都应指定兼容的返回类型。此外,参数类型列表(如果两者都存在)应在参数的数量和省略号终止符的使用中一致; 相应的参数应具有兼容的类型。

3.1.2.6 Compatible type and composite type节将兼容类型指定为具有相同类型的类型。它引用3.5.3表示类型限定符(其中const为1)和 表示:

  

要兼容两种合格类型,两者都应具有兼容类型的相同限定版本;说明符或限定符列表中类型限定符的顺序不会影响指定的类型。

现在您通常会认为intconst int 不是兼容类型。但是,我认为这是对标准的误读,因为int不是合格类型,因此上述引用不适用。

稍后会在3.5.4.3中提及更适用的引用:

  

对于使用限定类型声明的每个参数,这些比较的类型是其声明类型的非限定版本。

因此intconst int的比较类似,应予以允许。 这只是意味着根据标准不是错误。可能是微软在他们的智慧中仍然认为这是一个可疑行动,也是一个发出警告的好理由。

即使您认为存在问题,微软也不太可能为您解决问题(见下文)。


现在你可能想知道为什么当有更多现代标准时我会引用C89。

这是因为微软毫不掩饰Visual C ++主要是一个C ++编译器,并且只能根据here将C代码编译到标准的早期版本中:

  

感谢您抽出宝贵时间向我们发送您的建议。目前,还没有计划在VS2010中实施C99支持。完成此产品周期后,我们将审核所有客户建议,包括此建议,以便我们进一步规划。 - 微软的Mark Roberts。

而且,来自wikipedia page

  

根据Herb Sutter的说法,C编译器仅出于“历史原因”而被包括在内,并且不打算进一步开发。建议用户要么只使用C语言的有效C ++语言的子集,然后使用C ++编译器编译它们的代码,要么只使用不同的编译器,如Intel C ++ Compiler或GNU Compiler Collection。 / p>

Herb Sutter自己的博客,相关文章here证实了这一点:

  

我们不打算支持不属于C90或ISO C ++的ISO C功能。