C語言進階43:函數的意義——模塊化設計和extern

函數的由來:

    程序 = 算法 + 數據

  C程序 = 數據 + 函數

面向過程的程序設計:


面向過程是一種以過程爲中心的編程思想
首先將複雜的問題分解爲一個個容易解決的問題
分解過後的問題可以按照步驟一步步完成
函數是面向過程在C語言中的實現

解決問題的每個步驟可以用函數實現


函數聲明與函數定義:
聲明的意義在於告訴編譯器程序單元的存在
定義則明確指示程序單元的意義
C語言中通過extern進行程序單元的聲明
一些程序單元在聲明時可以忽略extern

我們來看下面代碼,體會聲明與定義的不同之處:

先定義一個test_O.c文件,定義一些變量和函數

#include <stdio.h>

int g_var = 10;  //如果改爲:float g_var = 10, 則打印g_var的值將出現不確定的結果(float的表示方式是不準確的)

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);
}

然後在test.c中使用這些變量和函數:

#include <stdio.h>
#include <malloc.h>

extern int g_var;    //在外部定義,但未告訴編譯器是如何定義的。變量的定義伴隨着內存的分配,所以在這個地方並不會分配空間

extern struct Test;  //在某些情況下,去掉extern也是可以的

int main()
{
    extern void f(int i, int j);
    extern int g(int x);
    
    struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test)); //如果用p指向一片堆上的空間,則報錯
	    //因爲sizeof結構體類型的大小無法在這個文件中被確定
	    //我們無法依靠程序被編譯的順序來保證上面代碼的合理性
	    //報錯:invalid application of ‘sizeof’ to incomplete type ‘struct Test’   未完全定義的結構體
    
    printf("p = %p\n", p);
    
    //g_var = 10;     //error
    
    printf("g_var = %d\n", g_var);
    
    f(1, 2);
    
    printf("g(3) = %d\n", g(3));
    
    free(p);
    
    return 0;
}

小結:
函數是面向過程思想在C語言中的體現
面向過程是由上至下分解問題的設計方法
程序中的定義和聲明完全不同
C語言中通過extern對程序單元進行聲明


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章