1. 程式人生 > >C之函數的意義(三十八)

C之函數的意義(三十八)

C語言 函數定義 函數聲明

我們知道在 C 語言中,程序是由一個個的函數組成的。那麽我們來看看函數的由來,程序 = 數據 + 算法 ==> C 程序 = 數據 + 函數;眾所周知,C 語言是面向過程的一種編程語言,那麽它就是采用的是模塊化程序設計的思想。下面這張圖更加形象的表示了 C 語言的特性

技術分享圖片

我們再來看看 C 語言中的模塊化

技術分享圖片

那麽面向過程的程序設計思想是怎樣的呢?面向過程是一種以過程為中心的編程思想;首先將復雜的問題分解為一個個容易解決的問題,分解過後的問題可以按照步驟一步一步的完成。函數是面向過程在 C 語言中的體現,解決問題的每個步驟可以用函數來實現。

下來我們來看看一個有意思的問題,聲明和定義一樣嗎?我們經常將函數聲明和函數定義搞混,聲明的意義在於告訴編譯器程序單元的存在,定義則明確指示程序單元的意義。C 語言中通過 extern

進行重新單元的聲明,一些程序單元在聲明時可以省略 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之函數的意義(三十八)