1. 程式人生 > >extern關鍵詞的作用

extern關鍵詞的作用

用法 它的 區別 找不到 聲明 由於 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關鍵詞的作用