+ -
当前位置:首页 → 问答吧 → 遇到一个编译迷惑

遇到一个编译迷惑

时间:2010-07-26

来源:互联网

  1. #include <stdio.h>


  2. int main(int argc,  char* argv[])
  3. {
  4.     int Id = 0;

  5.     Id = Get();
  6.     printf("main:%d\n",Id);


  7.     return 0;
  8. }

  9. int Get()
  10. {
  11.     int Id = 100;
  12.     return Id;
  13. }
复制代码
按理应该在使用Get函数,之前就声明一下的,但是不声明,一样能编译成功可执行文件,我甚至把头文件也去掉,一样能编译成功,我把两个函数放在不同的文件里,不在使用Get函数的文件里声明Get函数,一样能成功

有点郁闷, 请大侠指导,多谢

gcc --version
gcc (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

作者: anytoming   发布时间: 2010-07-26

能成功,但是會有警告吧.
加 -Wall參數了嗎.

作者: pandaiam   发布时间: 2010-07-26

Get() 编译时gcc当个符号,ld时已经认得这个符号在哪。比较牛叉

作者: zliming   发布时间: 2010-07-26

使用-Wall,编译器发出警告,隐式声明函数。
可能在不做显示声明时会将之声明为默认的样式,如返回整形,不带参数。
去掉头文件与不对Get进行声明是一样的道理。

作者: tempname2   发布时间: 2010-07-26

碰巧Get返回的是int,因此没问题。如果是其它返回值类型比如double,就悲剧了。

作者: emacsnw   发布时间: 2010-07-26



QUOTE:
碰巧Get返回的是int,因此没问题。如果是其它返回值类型比如double,就悲剧了。
emacsnw 发表于 2010-07-26 13:15



到底Gcc隐式声明时把函数声明成什么啊?

int main (){
  get (4,5,7);
  return 0;
}

int get (int a,int b,int c){
  return 0;
}

OK,似乎隐式声明时没有对参数做限制。

int main (){
  get (4,5,7);
  return 0;
}

double get (int a,int b,int c){
  return 0;
}
报错,似乎函数被隐式声明为返回int。

作者: tempname2   发布时间: 2010-07-26

相关阅读 更多