今天我花了很多时间找到一个可以通过这个简单代码证明的“错误”:
的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
如果函数声明和定义不匹配以及为什么不值得输出任何警告,有人可以解释一下它是如何工作的吗?
由于
答案 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 ++代码中获得,或者仅仅因为它需要更少的击键次数。)