Re: [語法] 不include而使用函式
看板C_and_CPP (C/C++)作者LPH66 ((short)(-15074))時間16年前 (2009/03/08 06:49)推噓0(0推 0噓 1→)留言1則, 1人參與討論串2/2 (看更多)
※ 引述《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
→
03/08 07:36, , 1F
03/08 07:36, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章