C 速查手冊

範圍規則

C 語言識別字 (identifier) 會有四種不同的效力範圍,如下

檔案範圍
函數範圍
區塊範圍
函數原型範圍

宣告在任何函數 (funciton) 之外的識別字 (identifier) 名稱都具有檔案範圍,如下例

#include <stdio.h>

void other(void);

int i = 0;

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

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

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:filescope.c
    功能:示範具檔案範圍的變數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc filescope.c
$ a.out
in main, i = 0
in other, i = 1
in main, i = 2
in other, i = 3
in main, i = 4
$

檔案範圍的意思是說整個檔案的任何函數均可使用,這樣使具有檔案範圍的識別字名稱形成全域變數 (global variable) 的效果。

具有函數範圍的識別字只有標籤,形如

lable:

識別字加上冒號,包括 switchgoto 所用的標籤,標籤可以在函數的任何位置使用,一旦超出函數的範圍,就無法利用函數內的標籤。

所謂的區塊範圍是指用大括弧 {} 圍起來的區域,如下例

#include <stdio.h>

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

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:blockscope.c
    功能:示範具有區塊範圍的變數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc blockscope.c
$ a.out
i = 0
in block, i = 1
in block, i = 99
i = 2
$

在區塊內重新宣告變數 i ,這是在區塊內的區域變數,並不會影響到區塊外的範圍。

至於效力範圍最窄的就是函數原型範圍,僅限於函數原型小括弧的參數列中。

回 C 速查手冊首頁