C之函數的意義(三十八)
阿新 • • 發佈:2018-05-02
C語言 函數定義 函數聲明 我們知道在 C 語言中,程序是由一個個的函數組成的。那麽我們來看看函數的由來,程序 = 數據 + 算法 ==> C 程序 = 數據 + 函數;眾所周知,C 語言是面向過程的一種編程語言,那麽它就是采用的是模塊化程序設計的思想。下面這張圖更加形象的表示了 C 語言的特性 進行重新單元的聲明,一些程序單元在聲明時可以省略 extern,嚴格意義上來說,聲明和定義並不相同!
我們再來看看 C 語言中的模塊化
那麽面向過程的程序設計思想是怎樣的呢?面向過程是一種以過程為中心的編程思想;首先將復雜的問題分解為一個個容易解決的問題,分解過後的問題可以按照步驟一步一步的完成。函數是面向過程在 C 語言中的體現,解決問題的每個步驟可以用函數來實現。
下來我們來看看一個有意思的問題,聲明和定義一樣嗎?我們經常將函數聲明和函數定義搞混,聲明的意義在於告訴編譯器程序單元的存在,定義則明確指示程序單元的意義。C 語言中通過 extern
我們通過下面這份示例代碼進行聲明和定義的分析
test.c 源碼
#include <stdio.h> #include <malloc.h> extern int g_var; extern struct Test; int main() { extern void f(int i, int j); extern int g(int x); struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test)); printf("p = %p\n", p); printf("g_var = %d\n", g_var); f(1, 2); printf("g(3) = %d\n", g(3)); free(p); return 0; }
global.c 源碼
#include <stdio.h> int g_var = 10; struct Test { int x; int y; }; void f(int i, int j) { printf("i + j = %d\n", i + j); } int g(int x) { return (int)(2 * x + g_var); }
我們在 global.c 中定義了 g_var 變量,結構體 Test 和 函數 f() 及 g()。在 test.c 中分別聲明了這些,並且使用了他們進行一些運算,我們來看看編譯是否可以通過。
我們看到編譯產生了一個警告,但是結果是正確的。在現代的 gcc 編譯器中,已經優化了結構體的聲明,也就是說,使用外部結構體的時候,不用使用 extern 關鍵字也可以。我們去掉 test.c 中第 6 行的 extern 關鍵字,編譯也可以通過。
通過對函數的學習,總結如下:1、函數是面向過程思想在 C 語言中的體現;2、面向過程是由上至下分解問題的設計方法;3、程序中的定義和聲明完全不同,C 語言中通過 extern 對程序單元進行聲明。
歡迎大家一起來學習 C 語言,可以加我QQ:243343083。
C之函數的意義(三十八)