1. 程式人生 > >extern修飾全域性變數正確用法和連結錯誤的解決方法

extern修飾全域性變數正確用法和連結錯誤的解決方法

首先:
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中編譯測試無法通過。