【转】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变量是怎么安排的。


博主说两句:

  1. GCC中为何函数不需要先声明后使用,而全局变量则需要?
    推测:全局变量的编译跟变量的类型密切相关,比如volatile, const等等,不同的类型汇编出来的代码应该会不一样;而函数没有这个问题。
  2. 不推荐没有声明直接调用函数!
    函数调用中传的实参可能和形参不符(类型/个数),这将会导致运行时无法预料的结果。
    但是如果事先声明了函数的原型,在编译时就可以预先进行错误检测。
  3. -Wmissing-declarations
    该选项会使GCC在调用没有声明过的函数时发出警告,使用它可以帮助我们检查头文件中是否遗漏了函数的声明。

posted on 2013-05-02 10:45  浙滨  阅读(357)  评论(0)    收藏  举报

导航