C 速查手冊

單元 7 - 宣告

C 語言宣告 (declaration) 的一般形式如下

type identifier;

實際上每個具有識別字 (identifier) 名稱的資料都屬於自動型或靜態型,兩種儲存類型之一。儲存類型指定詞有如下四種

auto
register
static
extern

宣告時理應加上儲存類型指定詞,形式如下

specifier type identifier;

若是沒有加上儲存類型指定詞,編譯器 (compiler) 一律視為 auto ,也就是自動型,宣告時會同時配置適當的記憶體空間,於函數 (function) 內使用,離開建立自動型變數的函數,該自動型變數會消失。如

#include <stdio.h>

void fun(void);

int main(void)
{
    int i = 55;
    
    printf("in main, i = %d\n", i);
    i++;
    fun();
    printf("in main, i = %d\n", i);
    i++;
    fun();    
    
    return 0;
}

void fun(void)
{
    int i = 33;
    
    printf("in fun, i = %d\n", i);
    i++;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:sc_test.c
    功能:示範 auto 自動型變數的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc sc_test.c
$ a.out
in main, i = 55
in fun, i = 33
in main, i = 56
in fun, i = 33
$

雖然 main()fun() 都有相同名稱的變數 i ,但兩者互不影響,同時每一次呼叫 fun()fun() 裡頭的變數 i 都會重新被設值為 33

宣告為 register 的變數,同樣屬於自動型,通常用於使用頻繁的控制變數,其為建議編譯器將此變數配置在暫存器中,以加快變數的存取。

staticextern 兩者為靜態型,宣告成 static 變數的特點是會保留其值,直到下次進入函數時仍以原先改變的值使用,如

#include <stdio.h>

void fun(void);

int main(void)
{
    int i = 55;
    
    printf("in main, i = %d\n", i);
    i++;
    fun();
    printf("in main, i = %d\n", i);
    i++;
    fun();    
    
    return 0;
}

void fun(void)
{
    static int i = 33;
    
    printf("in fun, i = %d\n", i);
    i++;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:se_test2.c
    功能:示範 static 靜態型變數的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc sc_test2.c
$ a.out
in main, i = 55
in fun, i = 33
in main, i = 56
in fun, i = 34
$

我們可以看到 main()fun() 的變數 i 都隨呼叫改變其值。

extern 用為使用函數外部宣告的變數,如

#include <stdio.h>

int i = 77;

int main(void)
{
    int i = 55;
    
    printf("main中宣告的 i = %d\n", i);
    i++;
    
    {
        extern int i;
        i++;
        
        printf("main外宣告的 i = %d\n", i);
    }
    
    printf("main中宣告的 i = %d\n", i);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:sc_test3.c
    功能:示範 extern 靜態型變數的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc sc_test3.c
$ a.out
main中宣告的 i = 55
main外宣告的 i = 78
main中宣告的 i = 56
$

除了在函數外使用 extern ,不同檔案若需要使用相同名稱的變數也可利用 extern 宣告。

C 語言宣告另外可用型態修飾詞,請繼續參考 C 速查手冊 - 儲存類型外的修飾

上一頁 6.5.6 函數指標
回 C 速查手冊首頁
上一頁 7.1 額外的修飾
回 C 教材首頁
回程式語言教材首頁