首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言作用域四大類:文件、函數、代碼塊、原型作用域詳解

     編輯:關於C語言

C語言作用域四大類:文件、函數、代碼塊、原型作用域詳解

作用域決定標識符可見範圍。C 語言標準定義四種作用域,本文逐一解析並對比。

四種作用域對比表

作用域適用對象範圍典型例子
文件作用域所有代碼塊外聲明從聲明處到文件結尾全局變量、函數定義
函數作用域語句標號整個函數體內goto label; 標號
代碼塊作用域{ } 內聲明從聲明處到右大括號局部變量、參數
原型作用域函數原型參數名僅在該原型聲明中void f(int x); 中的 x

詳細解析

1. 代碼塊作用域

void func() {
    int a = 1;        // 代碼塊作用域開始
    {                 // 內層代碼塊
        int b = 2;    // 僅內層可見
        printf("%d", a); // 可見外層 a
    }
    // printf("%d", b); // 錯誤:b 不可見
} // a 作用域結束
  • 局部變量、參數屬於此類
  • 內層可見外層,外層不可見內層
  • 同名變量內層遮蔽外層

2. 文件作用域

int global = 10;  // 文件作用域開始

void func1() { printf("%d", global); }  // 可見
void func2() { global = 20; }           // 可見
// 文件結尾作用域結束
  • 全局變量、函數定義
  • 同文件所有函數可見
  • 跨文件需 extern 聲明
  • static 限制為內部鏈接

3. 原型作用域

void func(int x, int y);  // x, y 僅在此行可見
void func(int a, int b) { // 實現中參數名可不同
    // x, y 在此不可見
}
  • 防止參數名與實現衝突
  • 參數名可省略:void func(int, int);
  • 純編譯期概念,無運行時實體

4. 函數作用域

void func() {
    goto label;
    // ...
    label: ;  // 標號在整個函數可見
}
  • 僅適用於 goto 標號
  • 同函數內標號必須唯一
  • 現代編程少用,了解即可

作用域 vs 生命周期

概念作用域生命周期
定義標識符可見範圍對象佔用內存時間
靜態局部變量代碼塊程序全期
全局變量文件程序全期
動態分配無 (指針有作用域)malloc 到 free
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved