首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

Linux中进行C编程,函数没有声明,直接调用,编译只有警告没有出错?该如何处理

2012-04-28 
Linux中进行C编程,函数没有声明,直接调用,编译只有警告没有出错?我在linux下写了一个很简单的程序:#includ

Linux中进行C编程,函数没有声明,直接调用,编译只有警告没有出错?
我在linux下写了一个很简单的程序:
#include<stdio.h>

int main(){
printf("This is main!\n");
function1();
function2();
return 0;
}

void function1(){
printf("This is function1!\n");
}

void function2(){
printf("This is function2!\n");
}

然后用gcc编译的时候,出现这样的警告:
waring: conflicting types for 'function1' [enabled by default]
note: previous implict declaration of 'function1' was here
waring: conflicting types for 'function2' [enabled by default]
note: previous implict declaration of 'function2' was here
但是没有错误,生成的可执行文件也是运行正常的?
这是为什么阿,应该出错的呀?

[解决办法]
编译器缘故?在vs下肯定是报错的。
可以这样写

C/C++ code
#include<stdio.h>void function1(){    printf("This is function1!\n");}void function2(){    printf("This is function2!\n");}int main(){    printf("This is main!\n");    function1();    function2();    system("pause");    return 0;}
[解决办法]
警告都说的很明白了,哪个单词不明白用google翻译一下呗
[解决办法]
gcc和vc还是有很大不同的
gcc只要代码有办法编译成功就不会报错误的
[解决办法]
警告说的很明白
[解决办法]
通常C语言并不要求函数一定要在被调用之前定义,编译器在处理到某个未知类型的函数时,会为其创建一个隐式声明,并假设该函数返回值类型为int。但编译器无法检查传递给该函数的实参类型和个数是否正确,所以这不利于编译器为我们排除错误。而且在VC编译器下,这样的代码会编译出错,一般可能提示“ error C2371: 'function1' : redefinition; different basic types”,因为编译器隐式声明了一个function1,VC编译器在后面遇到真实的function1定义时,真实的function1返回值并不是int,而是void。所以VC编译器认为function1函数重定义(redefinition)了。

另外在某些C语言书籍中,也看到过这样的内容:“C99遵循这样的规则:在调用一个函数之前,必须先对其进行声明或定义。调用函数时,如果此前编译器未见到该函数的声明或定义,会导致出错。”

所以,综上所述,尽管在gcc编译器中这样的代码仍然可以编译通过并且正确执行。也最好还是遵循这样的规则:在函数调用前,先对其定义或声明。
[解决办法]
你那个function()返回什么类型没有说明。
[解决办法]
是的,函数在使用前应该声明,main是主函数,程序一运行进入主函数后,在没有提前声明function的情况下,调用function,当然会有警告了。一般把main函数写在最后,就没事了
[解决办法]
我只补充说一句,VC这货叫做Microsoft Visual C++,,,它是C++编译器,C++是想100%兼容C语法,但是,事实上,它根本没做到100%兼容,而且C++有些地方是与C有冲突的,这也就造成了你VC不能编译某些正确C程序,,GCC这货,是C编译器,它的相应C++版本是G++,,
不要老是抱着VC学C,C++确实不是C
还有,个人总是觉得,C和C++一起学,特别是对于基础不好好打的人,非常容易弄混

探讨
通常C语言并不要求函数一定要在被调用之前定义,编译器在处理到某个未知类型的函数时,会为其创建一个隐式声明,并假设该函数返回值类型为int。但编译器无法检查传递给该函数的实参类型和个数是否正确,所以这不利于编译器为我们排除错误。而且在VC编译器下,这样的代码会编译出错,一般可能提示“ error C2371: 'function1' : redefinition; different basic t……

[解决办法]
函数的声明必须在函数的调用之前,如果没有,编译器假定存在这样一个函数,它返回int,然后在链接阶段,又发现了真正的函数符号,然后就冲突。

[解决办法]
调用之前找不到函数声明。

热点排行