使用gcc的編譯器 標頭檔案沒有包含stdlib.h,使用atoi函式(atoi函式在stdlib.h中才有宣告),編譯卻沒有出錯
如果編譯的時候加上-wall選項,會有個警告,請問這是為什麼?
這是因為c語言乙個非常傻的規定:乙個函式如果沒有宣告函式原型,其返回值型別就是int(所謂的implicit declaration)。由於atoi恰好真返回int,所以你即使不包含它的標頭檔案也不報錯。至於這個警告,是為了避免你由於忘記宣告函式原型而出錯。
編譯器對於沒有定義過的函式原型直接當作它返回int,它不需要知道它已經定義過了
也就是說,當你以乙個引數列表呼叫atoi時,編譯器已經知道這個函式的引數列表是什麼,它只不知道返回值而已,在這種情況下,編譯器還需要什麼額外的東西呢?它當然可以通過。
注意:編譯器不關心某個函式在哪個標頭檔案被定義,它只需要知道這個函式是什麼原型即可
#include//#includeint main()
gcc test.c -o test沒有任何警告
gcc -wall test.c -o test
出現警告:w9.c: in function `main':
w9.c:9: warning: implicit declaration of function `atoi'
w9.c:10: warning: implicit declaration of function `atof'
輸出結果:
i=23 f=1717986918.000000
加上#include則結果正常
看來atoi和atof都在c標準庫glibc中,但是很奇怪為什麼c標準庫函式sqrt和pow卻不在glibc中
C語言陣列的一些問題
我們都知道,陣列名可以當成乙個指標,同樣的函式名也可以當成乙個函式指標,指向函式的入口位址。現在有乙個問題,陣列名這個指標指向的是什麼呢?如果對陣列名再取位址,得到的又是什麼呢?我們來驗證這兩個問題。輸入以下 include stdio.h int main int p 3 a printf d,d...
C 一些問題
1 if else語句和switch case語句的效率分析對比 switch效率高。switch的效率與分支數無關,當只有分支比較少的時候,if效率比switch高,因為switch有跳轉表。分支比較多,那當然是switch 根據大量的實際程式測試 不考慮不同的編譯器優化程度差異,假設都是最好的優...
Go語言的一些問題
只要將檔案儲存一下,再執行就ok了。2.問題如下 d goprojects go build can t load package package no go files in d goprojects 3.截圖操作 起別名的命令,處理建立的二進位制檔案 4.主要要反覆儲存寫好的檔案,還有右下角出現...