extern修飾全域性變數正確用法和連結錯誤的解決方法
阿新 • • 發佈:2019-02-18
首先:
extern宣告的全域性變數的作用範圍是整個工程,我們通常在“.h”檔案中宣告extern變數之後,在其他的“.c”或者“.cpp”中都可以使用。extern擴大了全域性變數的作用域範圍,拓展到整個工程檔案中。
我們注意的問題是如何使用extern修飾全域性變數,可能在使用過程中出現了這樣那樣的問題,尤其是連結問題。
推薦的用法:
1.h檔案中
extern int e_i;//全域性變數的宣告
1.cpp或者1.c檔案中
#include "1.h"
int e_i = 0;//全域性變數的定義
其他.cpp或者.c檔案中可以直接使用e_i變數。
#include "1.h"
int i = e_i;
我們注意到,在宣告extern變數之後一定要對變數進行定義,並且定義的作用域要相同。
例如,在自定義類的標頭檔案StaticCounter.h
#pragma once
#include "stdio.h"
extern int e_i;
class StaticCounter
{
StaticCounter();
~StaticCounter();
}
如果在class StaticCounter的建構函式中去定義int e_i=0;那麼編譯之後會有連結錯誤,這是因為作用域不同引起的,需要在class StaticCounter實現的cpp檔案中的全域性區域定義int e_i=0;
#include "stdafx.h"
#include "StaticCounter.h"
int e_i = 0;
StaticCounter::StaticCounter()
{
//int e_i = 0;連結錯誤
}
StaticCounter::~StaticCounter()
{
}
不推薦的寫法:
直接在1.h檔案中
extern int e_i = 1;//宣告定義放在一起
這種寫法,在gcc編譯時會給出一個警告:warning: ‘e_i’ initialized and declared ‘extern’
在VS 2013中編譯測試無法通過。