user-0 提问: C语言调用函数必须申明吗？

回复:
user: user-1
content: 不声明确实可以正常运行，但是结果不一定是正确的。 如果没有在主函数前声明函数或把函数放在主函数前，这时编译器会自动的采用隐式函数声明，会将你所有的函数都声明为int类型。 你将变量和后面的函数都改为double类型试试看，估计结果会是错误的。

user: user-2
content: 看你的编译器版本了

user: user-3
content: 总结一下：我们要写的是能正确运行，得出正确结果的代码，而不是能通过编译的代码

user: user-4
content: 楼主，如图所示，你的程序没有一个错误，只有几个warning。。。。。。。。   但是我有几句话： 1   程序是给我们自己看的，你的语法规则在编译器下面通过。。。但是在别人眼里不一定通过 2   知道程序bug是怎样来的吗？？？大部分bug来自与程序员的不严谨：说白了，就是不在意细节，认为某些事可有可无。。。 3   程序要的不是简洁忽略某些警告从而造成错误，要的是平凡而稳定。  最后，希望楼主不要偷懒。。。。。。。。。仔细，脚踏实地。。。。。。。

user: user-5
content: 引用 16 楼 leleyjg 的回复:如不加#include<stdlib.h> VC6.0下编译报错， atof未定义。。 编译器不一样，我是用GCC。VC下的话，可以试下这个 #include <stdio.h> float fun();//这个注释掉，输出就是12.000000，不然是12.340000 int main() { 	float result;  	result = fun(); 	printf("%f\n",result); }  float fun() { 	float f = 12.34;  	return f; } 不过这例子在GCC下，error: conflicting types for ‘fun’。

user: user-6
content: 引用 14 楼 zxh707wk 的回复:[quote=引用 13 楼 cyd54454 的回复:] 最好加上前向声明，这样编译器就能在你调用该函数的时候，进行类型检查了。如果不加前向声明，那么编译器就会默认为函数的返回值或者参数的类型都是int。如果和你实际函数不符合，那么值就会出错。 提供一个简单的例子。  #include <stdio.h> #include <stdlib.h> //atof()的声明在此头文件中 int main() { 	char *a = "12.34"; 	float f;  	f = atof(a); //假如不加include <stdlib.h>，那么此处f = 0.000000，否侧是f = 12.340000 	printf("%f\n",f); } +1[/quote]  如不加#include<stdlib.h> VC6.0下编译报错， atof未定义。。

user: user-7
content: 引用 13 楼 cyd54454 的回复:最好加上前向声明，这样编译器就能在你调用该函数的时候，进行类型检查了。如果不加前向声明，那么编译器就会默认为函数的返回值或者参数的类型都是int。如果和你实际函数不符合，那么值就会出错。 提供一个简单的例子。  #include <stdio.h> #include <stdlib.h> //atof()的声明在此头文件中 int main() { 	char *a = "12.34"; 	float f;  	f = atof(a); //假如不加include <stdlib.h>，那么此处f = 0.000000，否侧是f = 12.340000 	printf("%f\n",f); } 学习了。。

user: user-3
content: 引用 13 楼 cyd54454 的回复:最好加上前向声明，这样编译器就能在你调用该函数的时候，进行类型检查了。如果不加前向声明，那么编译器就会默认为函数的返回值或者参数的类型都是int。如果和你实际函数不符合，那么值就会出错。 提供一个简单的例子。  #include <stdio.h> #include <stdlib.h> //atof()的声明在此头文件中 int main() { 	char *a = "12.34"; 	float f;  	f = atof(a); //假如不加include <stdlib.h>，那么此处f = 0.000000，否侧是f = 12.340000 	printf("%f\n",f); } +1

user: user-5
content: 最好加上前向声明，这样编译器就能在你调用该函数的时候，进行类型检查了。如果不加前向声明，那么编译器就会默认为函数的返回值或者参数的类型都是int。如果和你实际函数不符合，那么值就会出错。 提供一个简单的例子。  #include <stdio.h> #include <stdlib.h> //atof()的声明在此头文件中 int main() { 	char *a = "12.34"; 	float f;  	f = atof(a); //假如不加include <stdlib.h>，那么此处f = 0.000000，否侧是f = 12.340000 	printf("%f\n",f); }

user: user-8
content: 之前学的时候是要先声明后使用的，但昨天我用gcc编一个先使用后定义的，也编译通过了，看来是C99有了新规范吧

user: user-9
content: 最好是要声明，编译器不同会有差别。

user: user-10
content: 定义在main之前的可以不声明，定义在main之后的需要在使用前声明。

user: user-11
content: 好像有的编译器有时候就是可以，但最好都加上

user: user-12
content: 如果是在 main 函数之后进行函数定义的，那么调用时就一定要在 main 函数之前进行声明， 如果在自定义函数在 main 函数之前定义的，就可以不需要进行声明，main 函数能够自动找到该函数。 如果不进行函数声明，在其他的编译器中就会出现自定义函数找不到的现象，因为你用的VC++ 6.0编译器，它会自动兼容这种书写方式，但是这是一个很不好的习惯，一定不要培养！

user: user-13
content: 需要遵循先声明后使用的原则。

user: user-0
content: 引用 3 楼 user-15 的回复:http://stackoverflow.com/questions/3086592/c-function-declaration 意思是C89/90就不存在这个问题，而在C99就存在这个问题呗，VC++6.0支持的是C89/90呗

user: user-14
content: 可行，但不推荐 没有声明就调用函数，C编译器会为之生成一个临时声明，而临时声明和真正的函数定义未必是一致的

user: user-15
content: http://stackoverflow.com/questions/3086592/c-function-declaration

user: user-0
content: 引用 1 楼 moyac 的回复: 没出现问题啊 对啊，没问题，但是书上说这样调用是非法的啊,必须把要调用的函数放在前面，或者在之前先申明