C C 中函式宣告的作用

2021-10-20 11:35:22 字數 1858 閱讀 9344

參考:

一直想不明白,函式宣告的作用。在include中我們只是把函式的宣告放入**了,呼叫函式的具體實現還是要看函式的定義,那麼include函式宣告到底有什麼作用呢?按理說我只要能正確鏈結對應的函式定義就可以了呀?

在參考的部落格中看到這麼一段話:」其實函式宣告的作用是讓編譯器幫你檢查你呼叫函式時有沒有錯誤。比如引數的數量是否正確,如果呼叫函式時候少傳入乙個引數,並且沒有宣告該函式,編譯器無法知道你呼叫是否正確,只會提示乙個警告。很多人會忽略警告,導致最後程式執行時出現異常。「

我嘗試了下不宣告函式(也不定義),直接在main中呼叫,然後編譯**,確實僅僅報出未定義的warning:

編譯得到目標檔案test01.o,會提示warning:implicit declaration of function 『add』 :

gcc -c test01.c -o test01.o
add.h

int

add(

);

add.c

#include

"add.h"

intadd()

編譯得到動態鏈結庫libadd.so

gcc -shared -fpic add.c -o libadd.so
然後編譯出可執行檔案test01,並不會有任何報錯或warning,並且執行也正常

gcc test01.o -o test01 -l . -ladd -wl,-rpath=/home/txz/
這說明,只要我們的對於函式的呼叫方式正確(返回值,引數等都正確)並且能正確鏈結到函式,那說明即便是在函式中不include 標頭檔案(不宣告函式)也是沒有問題的!

然後我們進行另乙個實驗,延續上面的**但是把add.c和add.h中的add函式修改為:

int

add(

int u)

;

int

add(

int u)

意味著我們在test01.c中的add呼叫方式其實是寫錯了的,沒有傳入引數。那麼編譯能不能通過呢?完全可以!沒有任何報錯和warning!!!

那麼我們再在test01.c檔案中include add.h標頭檔案:

#include

#include

"add.h"

intmain()

編譯報錯:

test01.c: in function 『main』:

test01.c:4:16: error: too few arguments to function 『add』

printf("%d\n",add());

^~~in file included from test01.c:2:0:

add.h:1:5: note: declared here

int add(int u);

^~~

所以說假如在****現函式的傳入引數出錯等問題的話,沒有對函式進行宣告會導致在編譯階段無法發現錯誤!因為沒有通過函式宣告的方式告訴在本檔案中想要呼叫的這個函式的格式(返回值,型別,引數)!函式宣告的作用就是為了在編譯階段對函式呼叫格式和用法就進行檢查,檢查你的呼叫方式和宣告方式是否一致!

C C 中奇特的宣告

首先擺乙個問題 c c 裡的兩行 int uof 3 4 int flump 3 到底定義了個什麼東東?if你很清楚,那麼你可以return 了,else 就跟著我一起看下去吧!在使用c c 程式設計的時候,經常會遇到指標和陣列,本來也沒什麼,可有時候兩者偏偏就搞到一塊,組合成指標陣列或者陣列指標之...

詳解C C 函式指標宣告

要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表示式 語句和程式的。我們先來看看下面的乙個語句 1 void 0 這是當計算機啟動時,硬體將呼叫首位址為0位置的子例程。像這樣的表示式恐怕會令每個c c 程式設計師的內心都 不寒而慄 吧。然而,完全不...

詳解C C 函式指標宣告

要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表示式 語句和程式的。我們先來看看下面的乙個語句 1 void 0 這是當計算機啟動時,硬體將呼叫首位址為0位置的子例程。像這樣的表示式恐怕會令每個c c 程式設計師的內心都 不寒而慄 吧。然而,完全不...