C语言中不一致的声明和定义

C语言中不一致的声明和定义,c,visual-studio-2010,compiler-warnings,C,Visual Studio 2010,Compiler Warnings,今天,我花了大量时间寻找一个“bug”,它可以通过以下简单的代码来演示: main.c #include "func.h" #include <stdio.h> void main(){printf("func: %f", getX());} #include "func.h" static float x[2] = {1.0f, 2.0f}; float getX(int n){return x[n];} 函数h float getX(); 它编译&links(带/W3的VS

今天,我花了大量时间寻找一个“bug”,它可以通过以下简单的代码来演示:

main.c

#include "func.h"
#include <stdio.h>
void main(){printf("func: %f", getX());}
#include "func.h"
static float x[2] = {1.0f, 2.0f};
float getX(int n){return x[n];}
函数h

float getX();
它编译&links(带/W3的VS2010)时没有任何警告。 运行的示例输出为

func: 1.000000
有人能解释一下,如果函数声明和定义不匹配,它是如何工作的,为什么不值得输出任何警告


谢谢

此声明表示getX接受任意数量的参数:

float getX();
要声明不带参数的函数,请使用:

float getX(void);  // This will result in a compiler error for func.c
在C中:

不同于:

float getX(void);
在第一种情况下,您指定的函数返回
float
,但使用未指定的参数;在第二种情况下,您指定的函数返回
float
,但不使用参数

因此,形式
float getX(int n)
的定义与第一种情况兼容,但与第二种情况不兼容,这解释了为什么您没有看到错误/警告

如果您更改为正确的原型(第二个版本),那么您应该会看到所需的错误/警告

注意,这是不同于C++的行为,其中两种形式是等价的。 至于运行程序时看到的输出,这只是未定义行为的随机结果——如果使用不正确的参数调用函数,任何事情都可能发生


回传消息:在C中,当声明一个没有参数的原型时,总是应该使用第二种形式。不幸的是,人们会发现,人们很容易忽略 Value(可能是因为编写C++代码所获得的坏习惯,或者仅仅是因为它需要更少的击键)。.

main
必须在[0255]中返回
int
,而不是
void
。这不是您的主要错误,但它是一个错误。如何设置参数值的关键问题尚未回答。为什么它是重复的?问题的重要部分是关于将参数i=0传递给函数的问题。这里有两个问题:为什么编译时没有警告/错误,为什么得到1.0的输出?但这两个问题都是重复的——第一个问题是重复的,第二个问题是重复的,例如。不过,不要把它当作个人问题——这个问题及其答案仍然可能有用。谢谢,“默认”参数“n=0”是从哪里来的?彼得:这不是“默认”参数,这是未定义的行为。在我的机器上,结果是1。这只是未定义行为的随机结果-如果调用参数不正确的函数,任何事情都可能发生。@PaulR为了完整性,请将其添加到您的答案中好吗?我会接受的。非常感谢你的解释。@Peter:好的,已经做好了。
float getX(void);