考虑以下函数声明和定义。在头文件中:
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
。 )
答案 0 :(得分:2)
C89 3.5.4.3 Function declarators
有关于参数的说法:
要兼容两种功能类型,两者都应指定兼容的返回类型。此外,参数类型列表(如果两者都存在)应在参数的数量和省略号终止符的使用中一致; 相应的参数应具有兼容的类型。
第3.1.2.6 Compatible type and composite type
节将兼容类型指定为具有相同类型的类型。它引用3.5.3
表示类型限定符(其中const
为1)和 表示:
要兼容两种合格类型,两者都应具有兼容类型的相同限定版本;说明符或限定符列表中类型限定符的顺序不会影响指定的类型。
现在您通常会认为int
和const int
不是兼容类型。但是,我认为这是对标准的误读,因为int
不是合格类型,因此上述引用不适用。
稍后会在3.5.4.3
中提及更适用的引用:
对于使用限定类型声明的每个参数,这些比较的类型是其声明类型的非限定版本。
因此int
和const 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功能。