extern關鍵字的用法

目錄

總述

一、聲明外部變量

二、聲明外部函數

?三、實現模塊化編程

四、與"C" 連用,實現C和C++的混合編程

?五、注意事項

六、疑點補充(你可能會有和我一樣的疑問?)


總述

? ? ? ?在C和C++中,extern關鍵字用于聲明外部全局變量變量或函數,表明它們的定義位于其他文件中,從而允許在不同源文件之間共享變量和函數。以下是extern的常見用法:

一、聲明外部變量

一)用法

? ? ? ?在一個源文件中定義全局變量后,在其他源文件中使用extern聲明該變量,以便訪問它。

二)示例

? ? ? ? file1.c:定義全局變量

int globalVar = 10;

? ? ? ? file2.c:聲明并使用該變量

extern int globalVar;void func(){printf("globalVar = %d\n",globalVar);
}

二、聲明外部函數

一)用法

? ? ? ? 在一個源文件中定義函數后,在其他源文件中使用extern聲明該函數,以便調用它。

二)示例

????????file1.c:定義函數

void func(){//函數實現
}

? ? ? ? file2.c:聲明并調用該函數

extern void func();int main(){func();return 0;
}

?三、實現模塊化編程

一)用法

? ? ? ? 將extern聲明放在頭文件中,以便多個源文件包含頭文件后共享變量和函數。

二)示例

? ? ? ? header.h

#ifndef HEADER_H
#define HEADER_Hextern int globalVar;
extern void func();#endif

? ? ? ? file1.c

#include "header.h"int globalVar = 10;
void func(){//函數實現
}

? ? ? ? file2.c

#include "header.h"void anotherFunc(){printf("globalVar = %d\n",globalVal);func();
}

四、與"C" 連用,實現C和C++的混合編程

一)用法

? ? ? ? 在C++中,使用extern "C"指定按照C語言規則進行函數名修飾和鏈接,以便調用C語言編寫的庫函數或在C語言中調用C++編寫的函數。

二)示例

? ? ? ? C++代碼調用C函數

extern "C"{#include "c_library.h"
}int main(){c_function();return 0;
}

? ? ? ? C代碼調用C++函數

//C++ code
extern "C" void cpp_function(){//函數實現
}

?五、注意事項

一)聲明與定義的區別

? ? ? ? extern用于聲明變量或函數,定義時需要分配內存空間。變量只能定義一次,但可以多次聲明。

二)頭文件保護

? ? ? ? 在頭文件中使用extern聲明變量或函數時,應配合條件編譯指令(如#ifndef、#define、#endif)防止頭文件被重復包含。

? ? ? ? 通過合理使用extern關鍵字,可以提高代碼的組織性和可維護性,實現模塊化編程,并支持C和C++混合編程。

六、疑點補充(你可能會有和我一樣的疑問?

問:extern 引用的變量可以賦值嗎?

答:在 C 和 C++ 中,使用?extern?關鍵字聲明的變量本質上是一個指向已經在其他地方定義的變量的引用。它的主要作用是告訴編譯器這個變量在其他文件中定義,可以在當前文件中使用。關于賦值的問題,下面是一些要點:

一)賦值效果:雖然在聲明時使用?extern?不允許你直接給這個變量賦初始值,但你可以在任何地方(通常是在其定義所在的文件中)對其進行賦值。例如:

//file1.c
int myVar; // 定義
myVar = 10; // 可以賦值//file2.c
extern int myVar; //引用變量,不能初始化
myVar = 20; //可以賦值,雖然在其他文件中被引用void modifyValue(){myVar = 30; // 可以賦值
}int main(){modifyValue();printf("myVar = %d\n",myVar);return 0;
}

?二)初始化與賦值如果在同一作用域內聲明變量,extern聲明的變量不能被初始化。例如:

extern int myVar = 10; //錯誤:無法初始化extern聲明的變量

三)在函數內:在函數內部,你可以訪問extern聲明的變量并對其賦值,但前提是該變量在其他地方有定義。

????????總之,extern引用的變量是可以被賦值的在聲明時不能直接初始化它

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

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

相關文章

Jboss漏洞再現

一、CVE-2015-7501 1、開環境 2、訪問地址 / invoker/JMXInvokerServlet 出現了讓下載的頁面,說明有漏洞 3、下載ysoserial工具進行漏洞利用 4、在cmd運行 看到可以成功運行,接下來去base64編碼我們反彈shell的命令 5、執行命令 java -jar ysoserial-…

Android平臺毫秒級低延遲HTTP-FLV直播播放器技術探究與實現

一、前言 在移動互聯網蓬勃發展的今天,視頻播放功能已成為眾多Android應用的核心特性之一。面對多樣化的視頻格式和傳輸協議,開發一款高效、穩定的視頻播放器是許多開發者追求的目標。FLV(Flash Video)格式,盡管隨著H…

BUAA XCPC 2025 Spring Training 2

C \color{green}{\texttt{C}} C [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 給定一棵以 1 1 1 為根的樹,記 a i a_{i} ai? 表示節點 i i i 的權值, lca( i , j ) \text{lca(}i,j) lca(i,j) 表示節…

MySQL 中,分庫分表機制和分表分庫策略

在 MySQL 中,分庫分表是一種常見的數據庫水平擴展方案,用于解決單庫單表數據量過大導致的性能瓶頸問題。通過將數據分散到多個數據庫或表中,可以提高系統的并發處理能力、降低單點故障風險,并提升查詢性能。 一、分庫分表的作用 提升性能: 分散數據存儲和查詢壓力,避免單…

組件日志——etcd

目錄 一、簡介 二、安裝【Ubuntu】 安裝etcd 安裝CAPI 三、寫一個示例 3.0寫一個示例代碼 3.1獲取一個etcd服務 3.2獲取租約(寫端操作) 3.3使用租約(寫端操作) 3.4銷毀租約(寫端操作) 3.5獲取etcd服務中的服務列表(讀端操作) 3.6監聽狀態變化(讀端操作) 一、簡介 Et…

python網絡爬蟲開發實戰之網頁數據的解析提取

目錄 1 XPath的使用 1.1 XPath概覽 1.2 XPath常用規則 1.3 準備工作 1.4 實例引入 1.5 所有節點 1.6 節點 1.7 父節點 1.8 屬性匹配 1.9 文本獲取 1.10 屬性獲取 1.11 屬性多值匹配 1.12 多屬性匹配 1.13 按序選擇 1.14 節點軸選擇 2 Beautiful Soup 2.1 簡介…

理解操作系統(一)馮諾依曼結構和什么是操作系統

認識馮諾依曼系統 操作系統概念與定位 深?理解進程概念,了解PCB 學習進程狀態,學會創建進程,掌握僵?進程和孤?進程,及其形成原因和危害 1. 馮諾依曼體系結構 我們常?的計算機,如筆記本。我們不常?的計算機&am…

Tomcat常見漏洞攻略

一、CVE-2017-12615 漏洞原理:當在Tomcat的conf(配置?錄下)/web.xml配置?件中添加readonly設置為false時,將導致該漏洞產 生,(需要允許put請求) , 攻擊者可以利?PUT方法通過精心構造的數據包…

快速求出質數

要快速判斷一個數是否為質數,可以采用以下優化后的試除法,結合數學規律大幅減少計算量: 步驟說明 處理特殊情況: 若 ( n \leq 1 ),不是質數。若 ( n 2 ) 或 ( n 3 ),是質數。若 ( n ) 能被 2 或 3 整除&…

Linux上位機開發實戰(camera視頻讀取)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 關于linux camera,一般都是認為是mipi camera,或者是usb camera。當然不管是哪一種,底層的邏輯都是v4l2&#x…

高性能緩存:使用 Redis 和本地內存緩存實戰示例

在現代高并發系統中,緩存技術是提升性能和降低數據庫壓力的關鍵手段。無論是分布式系統中的Redis緩存,還是本地高效的本地內存緩存,合理使用都能讓你的應用如虎添翼。今天,我們將基于go-dev-frame/sponge/pkg/cache庫的代碼示例&a…

Python實現deepseek接口的調用

簡介:DeepSeek 是一個強大的大語言模型,提供 API 接口供開發者調用。在 Python 中,可以使用 requests 或 httpx 庫向 DeepSeek API 發送請求,實現文本生成、代碼補全,知識問答等功能。本文將介紹如何在 Python 中調用 …

山東大學數據結構課程設計

題目:全國交通咨詢模擬系統 問題描述 處于不同目的的旅客對交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的時間盡可能地短,出門旅游的旅客則期望旅費盡可能省,而老年旅客則要求中轉次數最少。編織一個全國城市間的交…

深入理解倒排索引原理:從 BitSet 到實際應用

倒排索引是一種極為重要的數據結構,它能夠高效地支持大規模數據的快速查詢,本文將深入探討倒排索引的原理,借助 BitSet 這種數據結構來理解其實現機制,并通過具體的JSF請求條件示例來展示其在實際應用中的運算過程。 BitSet&#…

Unity網絡開發快速回顧

知識點來源:總結人間自有韜哥在, 唐老獅,豆包 目錄 1.網絡通信-通信必備知識-IP地址和端口類2.網絡通信中序列化和反序列化2進制數據3.Socket類4.TCP同步服務端和客戶端基礎實現4.1.服務端基本實現4.2.客戶端實現: 5.區分消息類型…

內網滲透技術 Docker逃逸技術(提權)研究 CSMSF

目錄 如何通過上傳的webshell判斷當前環境是否是物理環境還是Docker環境 方法一:檢查文件系統 方法二:查看進程 方法三:檢查網絡配置 方法四:檢查環境變量 方法五:檢查掛載點 總結 2. 如果是Docker環境&#x…

動態規劃:從暴力遞歸到多維優化的算法進化論(C++實現)

動態規劃:從暴力遞歸到多維優化的算法進化論 一、動態規劃的本質突破 動態規劃(Dynamic Programming)不是簡單的遞歸優化,而是計算思維范式的革命性轉變。其核心價值在于通過狀態定義和決策過程形式化,將指數復雜度問…

數據結構與算法-數據結構-樹狀數組

概念 樹狀數組,也叫二叉索引樹(Binary Indexed Tree,BIT),它是用數組來模擬樹形結構。樹狀數組的每個節點存儲的是數組中某一段的和(或其他可合并的信息),通過巧妙的索引方式和樹形…

AI比人腦更強,因為被植入思維模型【19】三腦理論思維模型

定義 三腦理論思維模型是由美國神經科學家保羅麥克萊恩(Paul MacLean)提出的,該理論認為人類的大腦由三個不同但又相互關聯的部分組成,分別是爬蟲腦(Reptilian Brain)、邊緣腦(Limbic Brain&am…

使用 patch-package 優雅地修改第三方依賴庫

在前端開發中,有時我們需要對第三方依賴庫進行修改以滿足項目需求。然而,直接修改 node_modules 中的文件并不是一個好方法,因為每次重新安裝依賴時這些修改都會丟失。patch-package 是一個優秀的工具,可以幫助我們優雅地管理這些…