extern關鍵詞的作用
阿新 • • 發佈:2017-08-31
用法 它的 區別 找不到 聲明 由於 ace 例如 log
extern關鍵詞有兩個用途:
1. extern "C“ 表示修飾的函數是在C中定義的,告訴編譯器編譯時按照C的規則來編譯。這是由於C++為了實現函數的重載,在編譯時會將函數翻譯為函數名加參數的形式,例如void foo( int x, int y );會被翻譯成類似_foo_int_int的樣子,不同的編譯器格式不同,但原理類似。那麽在C++中調用C的函數時,會找不到C中的函數,因為在C中該函數被翻譯成了_foo之類的形式。為了能夠在C++中兼容C,所以在include頭文件時,需要加上extern "C"。
2.extern修飾變量或者函數,用來聲明全局變量,該變量可能在聲明的文件中之後的地方定義,也可能在其他文件中定義。要想搞明白這個,需要首先弄清楚聲明和定義的區別。
首先看一下聲明和定義的區別:
①變量定義:用於為變量分配存儲空間,還可為變量指定初始值。程序中,變量有且僅有一個定義。
②變量聲明:用於向程序表明變量的類型和名字。
③定義也是聲明:當定義變量時我們聲明了它的類型和名字。
比如下面的例子:
1 int i; //聲明一個變量i 2 i = 0; //定義變量i 3 int b = 0; //聲明並且定義變量b 4 5 int add(int a, int b); //聲明一個函數add 6 7 int add(int a, int b) //定義函數add 8 {9 return a + b; 10 }
清楚了聲明和定義的區別之後,就來看extern的具體用法。
1.在當前文件中聲明全局變量
1 #include "stdafx.h" 2 #include<iostream> 3 using namespace std; 4 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 extern void func(); //聲明全局函數func 8 func(); 9 10 extern int i; //聲明全局變量i 11 cout << i; 12 return 0; 13 14 } 15 16 int i = 5; 17 void func() 18 { 19 cout << "func called!\n"; 20 }
2.在其他文件中聲明全局變量,這種情況用於A.cpp要使用B.cpp中的全局變量,那麽可以在B.h中聲明全局變量,在B.cpp中定義全局變量,這樣A將B的頭文件引入後,就可以使用了
1 //B.h 2 3 extern int i;
1 //B.cpp 2 3 #include "B.h" 4 int i = 5;
1 // A.cpp : 定義控制臺應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include"B.h" 7 using namespace std; 8 9 int _tmain(int argc, _TCHAR* argv[]) 10 { 11 cout << i; 12 return 0; 13 }
3. static修飾全局變量
static修飾全局變量與extern恰好相反,static修飾的全局變量只能被當前文件使用,而無法在其他文件中使用
extern關鍵詞的作用