【发布时间】:2013-08-30 03:15:26
【问题描述】:
考虑以下函数声明和定义。在头文件中:
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-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86。我的命令行很简单cl test.c。)
【问题讨论】:
-
有趣。您在“常见做法”中在哪里看到过这种情况?是的,警告你是正确的,但在这种情况下,无论如何它都无关紧要,因为它是一个值参数,并且在实现方面的启动限制更大。用 pointer 来做这件事,它会产生 big 的不同。例如:考虑
const char*在原型 和char *在实现中的影响。 -
@WhozCraig - 带有指针参数的等价物是
char *const param,而不是const char *param。 -
@WhozCraig - 但是,我知道这没关系,这就是我的观点。这告诉编译器和任何开发人员
param不能被函数体更改,这是一个不需要在声明中公开的实现细节。那么为什么VS2010在没有不兼容、没有行为差异、没有意外行为可能性的情况下会发出警告呢? -
我明白了。我使用间接修改功能的差异来简单地说明它可以有所作为,但我当然明白你的观点,如果参数 var itself 是 @ 987654330@,那又何必呢。为此,我所能提供的就是:除了您在此处引用的特定 const-param 条件之外,该潜在警告在任何地方都有意义吗?如果是这样,是否可以想象,为此压制它,您可能会为其他人错过它?无论如何,我同意你在这种特定情况下的不必要性。 (对一个有趣的问题 +1)。
-
@WhozCraig - 您还会收到警告,例如。声明一个采用
int的函数,但将其定义为采用long,反之亦然,这是我想 想知道的(可能还有float/int我肯定想要一个警告,但我还没有检查)。
标签: c visual-studio-2010 c89