目錄
總述
一、聲明外部變量
二、聲明外部函數
?三、實現模塊化編程
四、與"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引用的變量是可以被賦值的,但你在聲明時不能直接初始化它。