[問題] 沒有把 stdio.h include 進來竟然也能댠…

看板C_and_CPP作者 (訪客ID)時間15年前 (2010/12/01 20:06), 編輯推噓9(9019)
留言28則, 13人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 剛剛心血來潮在測試gcc編譯, 寫了個 helloworld.c 但少了 #include<stdio.h> 這行 int main() { printf("hello, world"); return 0; } 竟然也能通過編譯並執行成功!? 這樣寫 #include<stdio.h> 是在寫辛酸的嗎 >_< 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) gcc in Ubuntu -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.137.63.174

12/01 20:10, , 1F
通常編譯器預設都有設定好引入這個標頭檔
12/01 20:10, 1F

12/01 20:10, , 2F
這其實是 K&R C 時代留下來的規定: 當看到一個還沒宣告的
12/01 20:10, 2F

12/01 20:11, , 3F
函式時要假設它是 int xxx(); 即不檢查參數回傳 int
12/01 20:11, 3F

12/01 20:11, , 4F
正好 printf 是回傳 int 所以什麼事都沒有
12/01 20:11, 4F

12/01 20:11, , 5F
連結時也因為連結上了 CRT 所以也沒有 link error
12/01 20:11, 5F

12/01 20:20, , 6F
所以只要回傳是int的, 沒被宣告都沒關係嘛?
12/01 20:20, 6F

12/01 20:25, , 7F
雖然沒關係,但不建議這麼做就是了,特別是自己的函式 XD
12/01 20:25, 7F
可是我剛剛又加了sin()函數進去竟然還是可以通過編譯!? 它應該是回傳float吧? int main() { printf("%f\n", sin(3)); return 0; } 這樣看來應該是gcc擅自把math.h inlcude進去嗎? ※ 編輯: guestid 來自: 114.137.63.174 (12/01 20:40)

12/01 20:41, , 8F
難道你都沒出現 warnning 嗎? ...
12/01 20:41, 8F
有warning但還是可以過阿~

12/01 20:56, , 9F
買一本程式設計師的自我修養看,就有完整說明了
12/01 20:56, 9F
哇~我這兩天就是在看這本耶~才剛開始看了一點點而已的說~ 覺得寫的滿好的,會努力把它喀完的~ 不過我非資訊本科較底層的東西基礎太差很難喀~.~

12/01 21:00, , 10F
C語言記得不用宣告function prototype就能用了?
12/01 21:00, 10F

12/01 21:01, , 11F
不過跟這例子有沒有關係就不知了
12/01 21:01, 11F

12/01 21:22, , 12F
函數原型宣告裡面,回傳值最不重要。參數會影響C++的名稱
12/01 21:22, 12F

12/01 21:23, , 13F
修飾,就算不是C++還會影響__cdecl協定下的堆疊平衡
12/01 21:23, 13F

12/01 21:24, , 14F
沒從原型宣告裡面知道正確的呼叫慣例,也會讓程式出錯
12/01 21:24, 14F
※ 編輯: guestid 來自: 111.82.239.20 (12/01 22:09)

12/02 02:24, , 15F
math.h 的函式的確 gcc 會認出來特別處理沒錯
12/02 02:24, 15F

12/02 02:49, , 16F
cmath要 -lm 忘記哪一版的gcc
12/02 02:49, 16F

12/02 08:19, , 17F
現在的gcc都要吧,好像是4.3以後變成嚴格檢查了
12/02 08:19, 17F

12/02 08:20, , 18F
某些寫作習慣不好的open source project就會編譯錯誤
12/02 08:20, 18F

12/02 08:21, , 19F
另外無視 warning 不是好習慣 ... 很多時候 warning比
12/02 08:21, 19F

12/02 08:22, , 20F
error 可怕 XD
12/02 08:22, 20F

12/02 12:49, , 21F
sin() 喔? -fno-builtin 加下去再試試...
12/02 12:49, 21F

12/02 12:51, , 22F
C 語言確實不需要宣告函式原型就能使用啊,只要函式本身:
12/02 12:51, 22F

12/02 12:51, , 23F
1. 是內建函式,直接展成 RTL。或
12/02 12:51, 23F

12/02 12:52, , 24F
2. 是 libc 裡面有的函式,因為預設會有 -lc。
12/02 12:52, 24F

12/02 12:52, , 25F
這樣都能順利編譯和連結,執行檔也可以跑。
12/02 12:52, 25F

12/02 15:02, , 26F
最好還是要有加標頭檔的習慣。=_=!
12/02 15:02, 26F

12/02 21:29, , 27F
推B大的warning筆error可怕這句話XD
12/02 21:29, 27F

12/02 23:45, , 28F
試看看在VC上會怎樣。。。一定打槍。
12/02 23:45, 28F
文章代碼(AID): #1CzZfTek (C_and_CPP)