extern關鍵字:C/C++跨文件編程利器

在 C 和 C++ 中,extern 是一個關鍵字,用于聲明變量或函數是在其他文件中定義的。它主要用于實現多個源文件之間的符號共享。

目錄

📌 一、C語言中的?extern

1. 基本作用

2. 示例說明

定義全局變量(只在一個?.c?文件中):

在另一個?.c?文件中使用該變量:

編譯方式:

3. 函數的?extern

4. 頭文件中使用?extern

📌 二、C++ 中的?extern

1. 基本用法與 C 相同

2.?extern "C"?的用途

使用場景:

示例:

📊 三、C vs C++ 中?extern?的對比

? 四、總結


📌 一、C語言中的?extern

1. 基本作用

  • 告訴編譯器該變量或函數已經在別處定義,當前只是引用。
  • 避免重復定義錯誤,同時允許鏈接器找到實際的定義位置。

2. 示例說明

定義全局變量(只在一個?.c?文件中):
// main.c
#include <stdio.h>int globalVar = 10;  // 全局變量定義extern void otherFunction();  // 聲明外部函數int main() {otherFunction();return 0;
}
在另一個?.c?文件中使用該變量:
// other.c
#include <stdio.h>extern int globalVar;  // 聲明為 extern,表示這個變量在別的地方定義void otherFunction() {printf("globalVar = %d\n", globalVar);
}
編譯方式:
gcc main.c other.c -o program

3. 函數的?extern

  • 所有函數默認都是?extern?的。
  • 所以你通常不會寫?extern void func();,而是直接聲明函數原型即可。
// main.c
void otherFunction();  // 默認就是 externint main() {otherFunction();return 0;
}
// other.c
#include <stdio.h>void otherFunction() {printf("Hello from otherFunction!\n");
}

4. 頭文件中使用?extern

為了方便管理多個 .c 文件中的變量引用,可以將 extern 聲明放在頭文件中:

// globals.h
#ifndef GLOBALS_H
#define GLOBALS_Hextern int globalVar;  // 聲明為 extern#endif

然后在各個 .c 文件中包含這個頭文件:

// main.c
#include "globals.h"int globalVar = 10;  // 只在這里定義一次int main() {...return 0;
}
// other.c
#include "globals.h"
#include <stdio.h>void otherFunction() {printf("globalVar = %d\n", globalVar);
}

📌 二、C++ 中的?extern

C++ 中的 extern 與 C 類似,但有一些擴展和差異。

1. 基本用法與 C 相同

// main.cpp
#include <iostream>int globalVar = 10;extern void otherFunction();int main() {otherFunction();return 0;
}
// other.cpp
#include <iostream>extern int globalVar;void otherFunction() {std::cout << "globalVar = " << globalVar << std::endl;
}

2.?extern "C"?的用途

這是 C++ 獨有的功能,用于關閉 C++ 的名字改編(name mangling)機制,以便調用 C 編寫的函數或變量。

使用場景:
  • 調用 C 庫函數
  • 混合編程:C++ 調用 C 編寫的?.c?文件中的函數或變量
示例:
// C 函數聲明
extern "C" {void c_function();int c_variable;
}int main() {c_function();std::cout << "c_variable = " << c_variable << std::endl;return 0;
}

這告訴編譯器:這部分符號按照 C 的方式來處理,不要進行 C++ 的重載解析或名稱修飾。


📊 三、C vs C++ 中?extern?的對比

特性C 中的?externC++ 中的?extern
基本用途聲明變量/函數在其他文件中定義同左
函數默認屬性所有函數默認是?extern同左
頭文件使用推薦在頭文件中用?extern?聲明變量同左
extern "C"? 不支持? 支持,用于兼容 C
名稱修飾(Name Mangling)? 無? 存在,默認開啟,需用?extern "C"?關閉
變量定義限制只能在一個?.c?文件中定義同左(ODR 規則)

? 四、總結

  • extern?是 C/C++ 中用于跨文件訪問變量或函數的關鍵字。
  • 在 C 中主要用于多文件共享全局變量。
  • 在 C++ 中除了類似功能外,還引入了?extern "C"?來支持與 C 的互操作。
  • 正確使用?extern?可以避免重復定義錯誤,并提高模塊化設計能力。

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

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

相關文章

編程語言的演化與選擇:技術浪潮中的理性決策

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;為什么“選對語言”比“掌握語言”更重要&#xff1f; 在軟件開發的世界里&#xff0c;語言是一切的基礎。…

【StarRocks系列】StarRocks vs Mysql

目錄 StarRocks 簡介 核心特性 典型應用場景 StarRocks vs MySQL&#xff1a;核心區別詳解 關鍵差異總結 如何選擇&#xff1f; StarRocks 簡介 StarRocks 是一款高性能、全場景、分布式、實時分析型的數據庫&#xff08;MPP - 大規模并行處理&#xff09;。它誕生于解決…

Axios 知識點全面總結

文章目錄 Axios 知識點全面總結一、Axios 基礎概念1. 什么是 Axios&#xff1f;2. 核心特性 二、安裝與基本用法1. 安裝2. 基本請求示例 三、請求方法與參數四、請求配置選項&#xff08;config&#xff09;五、攔截器&#xff08;Interceptors&#xff09;六、錯誤處理七、取消…

【軟考高級系統架構論文】論 SOA 在企業集成架構設計中的應用

論文真題 企業應用集成(Enterprise Application Integration, EAI)是每個企業都必須要面對的實際問題。面向服務的企業應用集成是一種基于面向服務體系結構(Service - Oriented Architecture, SOA)的新型企業應用集成技術,強調將企業和組織內部的資源和業務功能暴露為服務,實…

springboot 提供的可擴展接口

一、spring 和 springboot Spring框架提供了全面的基礎架構支持。包含依賴注入和開箱即用等模塊&#xff0c;如&#xff1a;Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test Spring Boot 約定大于配置-----消除了設置Spring應用程序所需…

python學習打卡day55

DAY 55 序列預測任務介紹 知識點回顧 序列預測介紹 單步預測多步預測的2種方式 序列數據的處理&#xff1a;滑動窗口多輸入多輸出任務的思路經典機器學習在序列任務上的劣勢&#xff1b;以隨機森林為例 作業&#xff1a;手動構造類似的數據集&#xff08;如cosx數據&#xff09…

Leetcode hot100 Java刷題

文章目錄 快排146. LRU 緩存acm模式樹的前中后序遍歷acm模式鏈表的基本操作1. 兩數之和49. 字母異位詞分組128. 最長連續序列283. 移動零11. 盛最多水的容器15. 三數之和42. 接雨水53. 最大子數組和56. 合并區間73. 矩陣置零48. 旋轉圖像141. 環形鏈表142. 環形鏈表 II24. 兩兩…

Linux 命令詳解 —— 進程管理

文章目錄 精通Linux操作系統(以Centos7為例)進程管理ps常用組合進程狀態 STAT 詳解高級篩選與格式化輸出按條件過濾進程自定義輸出字段顯示進程樹關系排障場景定位高 CPU檢查僵尸進程查看進程的線程查看進程打開的文件/網絡連接常用組合速查top前5摘要區進程列表信息交互式命令…

【軟考高級系統架構論文】論湖倉一體架構及其應用

論文真題&#xff1a; 隨著5G、大數據、人工智能、物聯網等技術的不斷成熟&#xff0c;各行各業的業務場景日益復雜&#xff0c;企業數據呈現出大規模、多樣性的特點&#xff0c;特別是非結構化數據呈現出爆發式增長趨勢。在這一背景下&#xff0c;企業數據管理不再局限于傳統…

Docker 高級管理筆記

前言&#xff1a;Docker 高級管理概述 隨著 Docker 技術的廣泛應用&#xff0c;容器化已成為現代軟件開發與部署的核心方式。本筆記聚焦 Docker 高級管理中的兩大關鍵技術 —— 容器通信與數據持久化&#xff0c;深入解析 Docker 網絡模式、端口映射、容器互聯機制及數據卷管理…

Spring Boot 項目初始化

一、什么是 CommandLineRunner CommandLineRunner 是 Spring Boot 提供的一個 函數式接口&#xff0c;聲明如下&#xff1a; 該接口只有一個 run(String... args) 方法&#xff0c;會在 Spring Boot 容器啟動完成后被自動調用。 你可以將它理解為一種“鉤子函數”&#xff0c;…

C# winform教程(二)----ComboBox

一、作用 一個可以輸入也可以下拉的列表框。 二、屬性 一般我們都是使用下拉列表&#xff0c;不使用在線編輯&#xff08;本人沒用過&#xff09; 屬性 名稱內容含義items組合框中項可以定義下拉列表的值DropDownStyle外觀和功能是否可以填寫&#xff0c;一般選擇dropdownli…

FFmpeg裁剪視頻在Android上的實現

添加依賴&#xff1a; implementation com.arthenica:mobile-ffmpeg-full:4.4.LTS 代碼實現&#xff1a; fun cropMiddleThird(inputPath: String, outputPath: String) {val cmd arrayOf("-y", // 覆蓋輸出文件"-i", inputPath,"-filter:v&quo…

openEuler 22.03 sp1 更新openssh 10.0p2 —— 筑夢之路

華為歐拉openEuler制作openssh 9.1/9.2/9.3 p1 rpm——筑夢之路_歐拉構建openssh-CSDN博客 上面是需要修改的sshd_config配置&#xff0c;將這3行注釋掉。 附上22.03 sp1的yum源文件 # cat openEuler.repo #generic-repos is licensed under the Mulan PSL v2. #You can use t…

AGI(4)大模型的推理綜述

本文源自基于基礎模型的推理綜述《A Survey of Reasoning with Foundation Models》&#xff0c;因為原文有點難于理解&#xff0c;在這個論文的基礎上增加了自己的解釋和理解&#xff0c;重新整理成此文。大家可以通過查看原文閱讀原始論文。 1、推理的概念 推理是解決復雜問題…

Rust 中的宏與函數

在 Rust 編程中&#xff0c;宏&#xff08;Macro&#xff09;和函數&#xff08;Function&#xff09;是兩種非常重要的編程工具。雖然它們都可以用來組織代碼和實現復用&#xff0c;但它們在定義方式、作用原理、性能、靈活性以及適用場景等方面存在諸多不同。本文將詳細介紹 …

c++中左值與右值

在 C++ 中,左值(lvalue) 和 右值(rvalue) 是表達式的基本屬性,它們決定了表達式能否被賦值、取地址等操作。 1. 核心定義 左值(lvalue) 特點:表示一個具名的、持久的對象,可位于賦值語句左側。示例: int x = 42; // x是左值 x = 100; // 合法:左值可…

DeepSeek14-open-webui 常用概念區分

I、“Tools & Functions” 與 Pipelines&#xff08;工作流系統&#xff09;區別 以下是“Tool & Functions”與“Pipelines”的區別、適用場景及作用的詳細分析&#xff0c;內容基于參考文檔提取與總結&#xff1a; 一、本質區別 維度Tool & FunctionsPipeline…

PaddleOCR + Flask 構建 Web OCR 服務實戰

1、前言 隨著圖像識別技術的發展,OCR(光學字符識別)已經成為很多應用場景中的基礎能力。PaddleOCR 是百度開源的一個高性能 OCR 工具庫,支持中英文、多語言、輕量級部署等特性。 而 Flask 是一個輕量級的 Python Web 框架,非常適合快速構建 RESTful API 或小型 Web 應用…

C++結構體初始化與成員函數實現語法詳解

C結構體初始化與成員函數實現語法詳解 一、結構體靜態成員初始化語法 在C中&#xff0c;靜態成員變量需要在類外部進行定義和初始化。提供的代碼展示了如何為MAIN_PROPULSION_CAN類的靜態成員變量進行初始化&#xff1a; MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPU…