全面解析C++中的extern關鍵字

在C++中,extern關鍵字經常會被用到,但不同場景下的含義又有所不同。本文將從多個方面對extern關鍵字做詳細的闡述,讓讀者更好地理解並熟練掌握extern的使用。

一、全局變數中的extern

在C++的全局變數定義中,extern關鍵字與static關鍵字是兩個相互矛盾的概念。全局變數定義時,如果前面沒有加上extern關鍵字,那麼該變數在其他的文件中就無法使用;而如果在其他文件中使用該變數,需要在聲明的時候加上extern關鍵字。

// file1.cpp
int g_num = 100; // 默認為extern int g_num = 100; 

// file2.cpp
extern int g_num; // 在此文件中聲明g_num的類型和名稱,不需要初始化 
int main() {
    cout << g_num << endl; // 輸出100 
    return 0;
}

上面的代碼中,第一個文件中定義了一個全局變數g_num,並將其初始化為100。在第二個文件中使用該變數時,需要在前面加上extern關鍵字,代表該變數在其他的文件中已經被定義。這樣之後,g_num就可以在第二個文件中被使用了。

二、函數聲明中的extern

在函數聲明中,extern關鍵字通常可以省略。當然,如果你願意的話可以自己主動添加extern關鍵字以強調函數是被聲明而非定義的。

// external.h
int max(int a, int b);

// external.cpp
int max(int a, int b) {
    return a > b ? a : b;
}

// main.cpp
#include "external.h"
int main() {
    int a = 100, b = 200;
    int result = max(a, b);
    cout << result << endl; // 輸出200
    return 0;
}

在上面的代碼中,external.h頭文件中聲明了一個max函數,但並沒有在該文件中定義該函數;這樣在external.cpp文件中定義該函數,在main.cpp文件中使用該函數時,只需要在頭文件中進行聲明即可。

三、extern “C”關鍵字

C++是一個支持函數重載的語言,因此C++不同的函數可以有相同的名稱。然而,C語言並不支持函數重載。為了在C++中調用C函數,需要用到extern “C”關鍵字。

// external.c
void print_hello() {
    printf("Hello\n");
}

// main.cpp
extern "C" {
    void print_hello();
}
int main() {
    print_hello(); // 輸出Hello
    return 0;
}

在上面的代碼中,external.c文件定義了一個列印Hello的函數print_hello。為了在C++中使用該函數,需要在C++文件中使用extern “C”加上函數聲明,來告訴編譯器這是一個C風格的函數。

四、extern關鍵字的其他用途

1. 引用變數

除了全局變數外,extern關鍵字還可以用來引用其他文件中的全局變數。

// external.cpp
int num = 100;

// main.cpp
extern int num;
int main() {
    cout << num << endl; // 輸出100
    return 0;
}

在上面的代碼中,main.cpp文件中引用了external.cpp文件中定義的全局變數num,因此需要在前面加上extern關鍵字進行聲明。

2. volatile關鍵字

volatile關鍵字用來修飾變數,用來告訴編譯器,該變數是易變的。而如果在多個文件中使用同一個易變的變數,需要在對應的文件中加上extern關鍵字。

// external.cpp
volatile int num = 100;

// main.cpp
extern volatile int num;
int main() {
    while (num < 200) {
        // do something
    }
    return 0;
}

在上面的代碼中,雖然num是一個全局變數,但由於該變數是易變的,因此在外部使用時需要加上volatile關鍵字,並在main.cpp中使用extern關鍵字進行聲明。

3. inline函數

在定義inline函數時,需要使用extern關鍵字進行修飾。inline函數可以用作小規模代碼的優化,將某個函數體的內容插入到對應的調用處。

// external.cpp
extern inline int max(int a, int b) {
    return a > b ? a : b;
}

// main.cpp
int main() {
    int a = 100, b = 200;
    int result = max(a, b);
    cout << result << endl; // 輸出200
    return 0;
}

在上面的代碼中,external.cpp文件中定義了一個inline函數max,並在main.cpp中進行了調用。為了保證inline函數能夠正確地進行定義和調用,需要在定義的時候使用extern關鍵字進行修飾。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/230714.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 18:19
下一篇 2024-12-10 18:19

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演著非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • 如何查看Python關鍵字

    Python是一種高級編程語言,具有很多有用的特性和優勢。在Python中,關鍵字被用於標識特定的語法結構。如果您正在學習Python編程,了解Python的關鍵字是非常重要的。在…

    編程 2025-04-29
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • 瘋狂Python講義的全面掌握與實踐

    本文將從多個方面對瘋狂Python講義進行詳細的闡述,幫助讀者全面了解Python編程,掌握瘋狂Python講義的實現方法。 一、Python基礎語法 Python基礎語法是學習P…

    編程 2025-04-28
  • 全面解析Python中的Variable

    Variable是Python中常見的一個概念,是我們在編程中經常用到的一個變數類型。Python是一門強類型語言,即每個變數都有一個對應的類型,不能無限制地進行類型間轉換。在本篇…

    編程 2025-04-28
  • Zookeeper ACL 用戶 anyone 全面解析

    本文將從以下幾個方面對Zookeeper ACL中的用戶anyone進行全面的解析,並為讀者提供相關的示例代碼。 一、anyone 的作用是什麼? 在Zookeeper中,anyo…

    編程 2025-04-28
  • Python合集符號全面解析

    Python是一門非常流行的編程語言,在其語法中有一些特殊的符號被稱作合集符號,這些符號在Python中起到非常重要的作用。本文將從多個方面對Python合集符號進行詳細闡述,幫助…

    編程 2025-04-28

發表回復

登錄後才能評論