深入理解 C 語言中的變量作用域與鏈接性:`extern`、`static` 與全局變量

深入理解 C 語言中的變量作用域與鏈接性:externstatic 與全局變量

在 C 語言中,變量的作用域(Scope)和鏈接性(Linkage)是理解程序結構和模塊化的關鍵概念。本文將詳細探討在函數外定義的變量是否為全局變量、其作用域,以及 externstatic 關鍵字的作用和區別。


一、函數外定義的變量是全局變量嗎?其作用域是什么?

是的,函數外定義的變量被稱為“全局變量”(Global Variable)。在 C 語言中,所有在函數外部定義的變量都具有文件作用域(File Scope),即它們在聲明之后的整個源文件中都可見,直到文件末尾為止。

示例:

#include <stdio.h>int x = 10; // 全局變量void func() {printf("x = %d\n", x); // 訪問全局變量
}int main() {int x = 20; // 局部變量,遮蔽全局變量func();printf("x = %d\n", x); // 訪問局部變量return 0;
}

輸出:

x = 10
x = 20

func 函數中訪問的是全局變量 x,而在 main 函數中訪問的是局部變量 x。如果在同一作用域內定義了同名的局部變量,則局部變量會遮蔽全局變量。


二、extern 聲明的作用是什么?其作用域是什么?

extern 關鍵字用于聲明一個變量在其他地方定義,告訴編譯器該變量在其他源文件中有定義。它本身不分配內存,只是提供一個引用,供鏈接器在鏈接階段解析。

作用:

  • 在當前文件中聲明一個在其他文件中定義的全局變量。
  • 使得多個源文件可以共享同一個全局變量。

作用域:

extern 聲明的變量的作用域與其定義位置相同,即文件作用域。它在聲明之后的整個源文件中可見,直到文件末尾為止。

示例:

文件 file1.c

#include <stdio.h>int x = 10; // 變量定義void func() {printf("x = %d\n", x); // 訪問全局變量
}

文件 file2.c

#include <stdio.h>extern int x; // 聲明外部變量void func(); // 聲明函數int main() {func();printf("x = %d\n", x); // 訪問全局變量return 0;
}

編譯命令:

gcc file1.c file2.c -o program

輸出:

x = 10
x = 10

file2.c 中,使用 extern 聲明 x,使得 main 函數能夠訪問在 file1.c 中定義的全局變量 x


三、extern 聲明放在函數內部和外部的區別?

  • 在函數外部: extern 聲明用于在當前源文件中引用其他源文件中定義的全局變量。
  • 在函數內部: extern 聲明用于在當前函數中引用其他函數或源文件中定義的全局變量。

無論 extern 聲明放在函數內部還是外部,作用域都是文件作用域,關鍵在于它是否在當前源文件中定義了變量。

示例:

#include <stdio.h>extern int x; // 在函數外部聲明void func() {extern int x; // 在函數內部聲明printf("x = %d\n", x);
}int x = 10; // 變量定義int main() {func();printf("x = %d\n", x);return 0;
}

輸出:

x = 10
x = 10

無論 extern 聲明放在函數內部還是外部,作用域都是文件作用域,關鍵在于它是否在當前源文件中定義了變量。


四、externstatic 的區別?

  • extern 表示外部鏈接,允許在其他源文件中訪問變量。
  • static 表示內部鏈接,限制變量只能在當前源文件中訪問,不能被其他源文件引用。

示例:

#include <stdio.h>static int x = 10; // 內部鏈接void func() {printf("x = %d\n", x); // 訪問當前源文件中的變量
}

在其他源文件中,無法通過 extern 聲明訪問 x,因為它具有內部鏈接。


五、extern 與函數的關系?

在 C 語言中,函數默認具有外部鏈接,因此無需使用 extern 聲明即可在其他源文件中訪問。為了提高代碼的可讀性和可維護性,通常在頭文件中使用 extern 聲明函數。

示例:

// header.h
extern void func(); // 聲明函數// file1.c
#include "header.h"void func() {printf("Hello from func!\n");
}// file2.c
#include "header.h"int main() {func(); // 調用函數return 0;
}

file2.c 中,通過包含 header.h 頭文件,可以調用在 file1.c 中定義的 func 函數。


六、總結

  • 全局變量: 在函數外定義的變量,作用域為文件作用域,生命周期為程序運行期間。
  • extern 聲明: 用于在當前源文件中引用其他源文件中定義的全局變量,作用域為文件作用域。
  • static 用于限制變量的作用域為當前源文件,不能被其他源文件引用。
  • 函數: 默認具有外部鏈接,可以在其他源文件中訪問,通常在頭文件中聲明。

理解這些概念有助于編寫結構清晰、模塊化的 C 語言程序。如有更多疑問,歡迎繼續提問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗三 軟件黑盒測試

實驗三 軟件黑盒測試使用測試界的一個古老例子---三角形問題來進行等價類劃分。輸入三個整數a、b和c分別作為三角形的三條邊&#xff0c;通過程序判斷由這三條邊構成的三角形類型是等邊三角形、等腰三角形、一般三角形或非三角形(不能構成一個三角形)。其中要求輸入變量&#x…

小米首個推理大模型開源——Xiaomi MiMo,為推理而戰!

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、MiMo的驚人表現&#xff1a;小參數量&#xff0c;大能力二、雙輪驅動&#…

《2025全球機器學習技術大會:阿里云講師張玉明深度剖析通義靈碼AI程序員》

4 月 18 日 - 19 日&#xff0c;由 CSDN & Boolan 聯合舉辦的 2025 全球機器學習技術大會&#xff08;ML-Summit&#xff09;于上海順利舉行。大會聚焦人工智能與機器學習前沿技術&#xff0c;匯聚了來自科技與人工智能領域的數位頂尖專家以及數千名開發者和研究者&#xf…

MySQL事務隔離級別詳解

MySQL事務隔離級別詳解 事務隔離級別概述 MySQL支持四種標準的事務隔離級別&#xff0c;它們定義了事務在并發環境下的可見性規則和可能出現的并發問題&#xff1a; READ UNCOMMITTED&#xff08;讀未提交&#xff09; ? 最低隔離級別 ? 事務可以讀取其他事務未提交的數據&…

計算機視覺(CV)技術的優勢和挑戰(本片為InsCode)

計算機視覺&#xff08;CV&#xff09;技術是一種利用計算機和算法來模擬人類視覺實現圖像和視頻處理的技術。它在各個領域都有著廣泛的應用&#xff0c;具有許多優勢和挑戰。 優勢&#xff1a; 自動化&#xff1a;CV 技術可以自動識別、分類、跟蹤和分析圖像和視頻數據&…

Android JIT編譯:adb shell cmd package compile選項

Android JIT編譯&#xff1a;adb shell cmd package compile選項 例如&#xff1a; adb shell cmd package compile -m speed -f --full 包名 配置參數指令說明&#xff1a; compile [-r COMPILATION_REASON] [-m COMPILER_FILTER] [-p PRIORITY] [-f] [--primary-dex] …

Android Kotlin 項目集成 Firebase Cloud Messaging (FCM) 全攻略

Firebase Cloud Messaging (FCM) 是 Google 提供的跨平臺消息推送解決方案。以下是在 Android Kotlin 項目中集成 FCM 的詳細步驟。 一、前期準備 1. 創建 Firebase 項目 訪問 Firebase 控制臺點擊"添加項目"&#xff0c;按照向導創建新項目項目創建完成后&#x…

搭建PCDN大節點,服務器該怎么配

搭建P2P大節點時&#xff0c;服務器要怎么配呢&#xff1f;需要綜合考慮硬件性能、網絡帶寬、存儲能力、系統架構以及安全性等多個方面&#xff0c;以確保節點能夠高效、穩定地運行。 一、硬件配置 CPU&#xff1a;選擇高性能的多核處理器&#xff0c;以滿足高并發處理需求。核…

(done) 吳恩達版提示詞工程 8. 聊天機器人 (聊天格式設計,上下文內容,點餐機器人)

視頻&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 別人的筆記&#xff1a;https://zhuanlan.zhihu.com/p/626966526 8. 聊天機器人&#xff08;Chatbot&#xff09; …

AtCoder Beginner Contest 403(題解ABCDEF)

A - Odd Position Sum #1.奇數數位和 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #include<queue> #include<cstring> #include<stack> #include&l…

【Game】Powerful——Abandoned Ruins(9)

文章目錄 1、新增古玩2、機關機制3、探索法寶4、智斗強敵5、地圖6、參考 2025 年 1 月迎來的新玩法——荒廢遺跡 每周四個寶藏鏟&#xff08;老玩法&#xff09;或者兩個遺跡線索&#xff08;新玩法&#xff09;&#xff0c;3 個寶藏鏟也可以換一個遺跡線索&#xff0c;之前沒時…

構建網頁版IPFS去中心化網盤

前言&#xff1a;我把它命名為無限網盤 Unlimited network disks&#xff08;ULND&#xff09;&#xff0c;可以實現簡單的去中心化存儲&#xff0c;其實實現起來并不難&#xff0c;還是依靠強大的IPFS&#xff0c;跟著我一步一步做就可以了。 第一步&#xff1a;準備開發環境…

國標GB28181視頻平臺EasyGBS在物業視頻安防管理服務中的應用方案?

一、方案背景? 在現代物業服務中&#xff0c;高效的安全管理與便捷的服務運營至關重要。隨著科技的不斷發展&#xff0c;物業行業對智能化、集成化管理系統的需求日益增長。EasyGBS作為一款基于國標GB28181協議的視頻監控平臺&#xff0c;具備強大的視頻管理與集成能力&#…

[Unity]設置自動打包腳本

背景 我們經常會使用自動打包功能 文件名稱: AutoBuild.csusing System.IO; using System.Linq; using UnityEditor; using UnityEngine;public class AutoBuilder {[MenuItem("Build/GetCurrentBuildTarget")]public static void GetCurrentBuildTarget(){Debug.L…

正點原子STM32H743單片機實現ADC多通道檢測

目標 使用STM32CubeMX工具&#xff0c;配置ADC相關參數&#xff0c;實現在STM32H743單片機上獲取ADC多通道電壓值。共14個ADC引腳&#xff0c;ADC2有5個&#xff0c;ADC3有9個&#xff0c;全部設置單通道 ADC引腳 PF3PF4PF5PF10PC0PC2PC3PH2PH3PA3PB0PB1PA4PA5PA6 STM32cube…

深度學習基礎(四)——計算量(FLOPs)、參數量(Params)、計算速度(FLOPS/TOPS))

一、計算量FLOPs FLOPs&#xff0c;全稱為Floating Point Operations, (s為復數縮寫&#xff09;&#xff0c;浮點運算數&#xff0c;指模型完成一次前向傳播所需的浮點運算次數&#xff0c;可以理解為計算量&#xff08;模型的時間復雜度&#xff09;&#xff0c;用來衡量算法…

電子秤檢測管理系統開發實戰:從數據采集到可視化大屏

簡介 電子秤作為現代工業生產和商業流通中的核心計量設備,其準確性直接關系到產品質量和交易公平。針對仙貝生產企業的電子秤管理需求,我們開發了一套集電子秤檢測信息錄入、產品信息管理、實時稱重數據采集和后臺可視化大屏于一體的綜合管理系統。該系統基于Django框架構建…

Cesium添加WMS,WMTS,地形圖圖,3D Tiles數據

在 Cesium 中&#xff0c;你可以添加 WMS、WMTS、地形圖 和 3D Tiles 數據源。以下是詳細的實現方法&#xff1a; 1. 添加 WMS 服務 WMS&#xff08;Web Map Service&#xff09;是一種動態地圖服務&#xff0c;適用于加載柵格地圖圖層。 代碼示例 const viewer new Cesium…

數據庫基本概念:數據庫的定義、特點、分類、組成、作用

一&#xff1a;數據庫相關概念 1.1 定義 &#xff08;1&#xff09;數據庫&#xff1a;存儲數據的倉庫 &#xff08;2&#xff09;數據庫管理系統&#xff1a;模擬和管理數據庫的大型軟件 &#xff08;3&#xff09;SQL&#xff1a;操作關系型數據庫的編程語言&#xff0c;定義…

【項目篇之消息序列化】仿照RabbitMQ模擬實現消息隊列

實現消息序列化 為什么不使用JSON來序列化直接使用二進制序列化實現序列化方法toBytes()1&#xff1a; 創建內存緩沖區??2 &#xff1a;創建對象序列化通道?3&#xff1a;執行序列化操作?4&#xff1a;提取二進制數據&#xff0c;轉換成byte[]序列化圖示流程&#xff1a;序…