C893.5.4.3 Function declarators
对参数有这样的说法:
对于要兼容的两种函数类型,两者都应指定兼容的返回类型。此外,参数类型列表(如果两者都存在)应在参数数量和省略号终止符的使用方面达成一致;相应的参数应具有兼容的类型。
部分3.1.2.6 Compatible type and composite type
将兼容类型指定为具有相同类型的类型。它引用3.5.3
了类型限定符(其中const
之一)并指出:
对于要兼容的两个限定类型,两者都应具有兼容类型的相同限定版本;说明符或限定符列表中类型限定符的顺序不影响指定的类型。
现在,您通常会因此认为它int
是const int
不兼容的类型。但是,我认为这是对标准的误读,因为int
它不是合格的类型,因此上面的引用不适用。
稍后有一个更适用的引用3.5.4.3
说明:
对于使用限定类型声明的每个参数,其用于这些比较的类型是其声明类型的非限定版本。
因此int
和const int
被类似地比较并且应该被允许。但这仅意味着根据标准它不是错误。微软可能仍然认为这是一个可疑的行为,也是发出警告的充分理由。
即使您认为这是一个问题,Microsoft 也不太可能为您解决它(见下文)。
现在您可能想知道,当有更多现代标准可用时,我为什么要引用 C89。
这是因为 Microsoft 毫不掩饰 Visual C++ 主要是 C++ 编译器,并且只能将 C 代码编译为标准的早期迭代,如下所示:
感谢您抽出宝贵时间向我们发送您的建议。目前,没有计划在 VS2010 中实现 C99 支持。一旦我们完成了这个产品周期,我们将审查所有客户的建议,包括这个,以便我们未来的规划。- 马克·罗伯茨,微软。
而且,从维基百科页面:
根据 Herb Sutter 的说法,C 编译器只是出于“历史原因”而包含在内,不打算进一步开发。建议用户要么仅使用也是有效 C++ 的 C 语言子集,然后使用 C++ 编译器来编译他们的代码,或者只使用不同的编译器,例如 Intel C++ Compiler 或 GNU Compiler Collection。
这在 Herb Sutter 自己的博客中得到了证实,相关文章在这里:
我们不打算支持不属于 C90 或 ISO C++ 的 ISO C 功能。