作者LPH66 ((short)(-15074))
看板C_and_CPP
标题Re: [语法] 不include而使用函式
时间Sun Mar 8 06:49:10 2009
※ 引述《carlcarl (carl)》之铭言:
: 嗯 刚刚看了一下 有这个的一些讲解
: 主要是讲printf的
: 那我在想
: 是不是自己在另外一个档写函式A的实做
: 然後在主档去呼叫这函式也是同样的情形呢?(没有include有写函式A实做的档)
: 也就是我用gcc的话 compiler会另外把这函式A定义成一个回传int的extern函式?
: (用g++的话 他会提醒说我在主档使用的函式是未宣告的)
: 他的执行内容就变成未知的吗 ? 也就是不知道会执行什麽这样
: 因为我在测试的时候 有时後回传会有正确的值 有时候却是nan
: 正确的值是碰巧产生的吗?
: 用gdb测试也找不出来为什麽 用"p 函式A(参数)" 印出来都是正确的值
: "p 函式 " 印出来的函式定义也是正确的
: 而实际运作回传值给另外一个变数 就会是nan 怪怪的= =a
这是早期的 C 的一个规定 (不确定是否在 K&R 时代就有了的)
当一个尚未被宣告的函式被先呼叫时
compiler 要预设它是 int xxx() 即不检查参数 回传int
(离题一下 int xxx(void) 和 int xxx() 是不同的喔
前者是没有参数 後者是不检查参数)
那正好 printf 也是回传 int 所以什麽事都没有
如果你是拿去呼叫 <math.h> 里的函式的话就惨了
因为里面大部份都是 double 或 float 为回传值的函式
那些函式不一定会用和 int 一样的方法来回传值
例如像在 x86 的机器上
近代的不少 compiler 实作成 double 是利用浮点数暂存器 st(0) 回传的
而不是像 int 一样用 eax 回传
所以到时回传回来是啥鬼完全不知道
(这里还可以扯到 calling convention 不过会扯太远就暂且打住)
而且到时在 link 的时候 linker 还会向你抱怨类似像「我找不到回传 int 的 pow 啦」
而 C++ 有规定函式要先宣告 取消了这种隐含宣告
所以 g++ 才会告诉你有函式未宣告
(是说前一阵子看那本日本人写的短码书有提到
忘了是 gcc 还是 g++ 有在 compiler 里面对 math.h 的函式做特殊处理
所以会自动判别那些其实是回传 double/float 而不用先 #include <math.h>
好像是 gcc 啦 暂时书不在手边不能查 QQ)
---
话说回来, 其实 #include 我一直把它定位成懒人用宣告指令 XD
因为这通常是用在跨档编译 很多档都会去用到某一些没写在这里的函式/结构/等等时
把那些东西的宣告给集中在一个 header file 里面 一口气 #include 进来而已
也就是说 你可以只在一个档里宣告函式 实作在另一个档里 不必写 header file
只要到时候有把它们 link 起来就好了
--
[LPH] Oops, your OOP's a problem? 说:
你现在还是看不到狗?
************* 说:
看得到 只是 他们不会跑 就一直呆呆在那边 一直在起点
[LPH] Oops, your OOP's a problem? 说:
你要按"ㄅㄧㄤˋ"它们才会跑啊@@"
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.250.80
1F:→ zlw:原来如此 03/08 07:36