C中的声明和定义不一致

时间:2014-10-03 07:42:57

标签: c visual-studio-2010 compiler-warnings

今天我花了很多时间找到一个可以通过这个简单代码证明的“错误”:

的main.c

#include "func.h"
#include <stdio.h>
void main(){printf("func: %f", getX());}

func.c

#include "func.h"
static float x[2] = {1.0f, 2.0f};
float getX(int n){return x[n];}

func.h

float getX();

它编译&amp;链接(VS2010与/ W3)没有任何警告。 运行的样本输出是

func: 1.000000

如果函数声明和定义不匹配以及为什么不值得输出任何警告,有人可以解释一下它是如何工作的吗?

由于

2 个答案:

答案 0 :(得分:4)

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

float getX();

要声明不带参数的函数,请使用:

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

答案 1 :(得分:4)

在C:

float getX();

与:

不同
float getX(void);

在第一种情况下,您指定的函数返回float但接受未指定的参数 - 在第二种情况下,您指定的函数返回float,但需要无参数

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

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

请注意,这与C ++不同,其中两种形式是等效的。

至于运行程序时看到的输出,这只是未定义行为的随机结果 - 如果调用参数不正确的函数,任何事情都会发生。

带回家消息:在C中你应该在声明一个不带参数的原型时总是使用第二种形式 - 不幸的是你会发现人们忽略void是很常见的(可能是因为坏习惯)从编写C ++代码中获得,或者仅仅因为它需要更少的击键次数。)