【转】gcc编译器对待函数声明与TurboC的区别
转自:http://blog.chinaunix.net/uid-20255196-id-1712866.html
无意中发现,gcc的函数调用可以在没有在main()函数之前声明就可以使用。
1 main() 2 { 3 func1(); 4 } 5 6 func1() 7 { 8 func2(); 9 } 10 11 func2() 12 { 13 ; 14 }
像这种函数调用是可以在gcc下编译通过的,也就是说,不声明就可以使用。各个函数放在文件里,main.c中不放它们的声明结果也是可以通过的 ------还有几个问题没弄明白:05.09.06
- 同一个文件中可以包含几个函数,这几个函数上方可以定义全局变量,但是一个可执行文件的其他函数要使用此全局变量必须先做extern的声明才能使用,为什么?
- 他们在内存中,编译时是怎么安排的?
- 2。头文件内函数声明的顺序与他们的相互调用关系应该没有什么关系,那么,编译连接以及执行时,函数调用过程是怎样的?全局变量,extern变量是怎么安排的。
博主说两句:
- GCC中为何函数不需要先声明后使用,而全局变量则需要?
推测:全局变量的编译跟变量的类型密切相关,比如volatile, const等等,不同的类型汇编出来的代码应该会不一样;而函数没有这个问题。 - 不推荐没有声明直接调用函数!
函数调用中传的实参可能和形参不符(类型/个数),这将会导致运行时无法预料的结果。
但是如果事先声明了函数的原型,在编译时就可以预先进行错误检测。 - -Wmissing-declarations
该选项会使GCC在调用没有声明过的函数时发出警告,使用它可以帮助我们检查头文件中是否遗漏了函数的声明。
浙公网安备 33010602011771号