2017-04-22 71 views
3

我有一個程序,其中我定義的全局靜態變量一旦離開我的「初始化函數」(不是構造函數)就不會保持初始化。下面是程序:全局靜態變量不是「保持定義」功能之外

type.h

namespace type 
{ 
    static int * specialInt; 
} 

type.cpp

#include "type.h" 

(這是有意留爲空)

Branch.h

#include "type.h" 

namespace type 
{ 
    bool initInt(); 
} 

Branch.cpp

#include "Branch.h" 
#include <iostream> 

namespace type 
{ 
    bool initInt() 
    { 
     specialInt = new int; 
     *specialInt = 95; 
     std::cout << "Address from initInt(): " << specialInt << std::endl; 
     return true; 
    } 
} 

Leaf.h

#include "Branch.h" 
#include <iostream> 

namespace type 
{ 
    void PrintInt(); 
} 

Leaf.cpp

#include "Leaf.h" 

namespace type 
{ 
    void PrintInt() 
    { 
     std::cout << "Address: " << specialInt << std::endl; 
     std::cout << "Value: " << *specialInt << std::endl; 
    } 
} 

main.cpp中

#include "Leaf.h" 

int main() 
{ 
    type::initInt(); 
    type::PrintInt(); 
    return 0; 
} 

的輸出是從initInt()

地址:007F5910

地址:00000000

它崩潰之前。我讀到關鍵字static讓變量有外部鏈接,所以爲什麼這會失敗?爲什麼變量在initInt()之外變得不確定?

回答

3
namespace type 
{ 
    static int * specialInt; 
} 

這是一個靜態整數指針的定義static在名稱空間範圍內請求內部鏈接:包括type.h的每個翻譯單元都獲得其自己的獨立版本specialInt。然後,當然,對specialInt之一所做的更改不會影響其他的。

你婉做什麼是聲明變量在type.h

namespace type 
{ 
    extern int * specialInt; 
} 

...並在翻譯單位之一提供一個單一的定義:

#include "type.h" 

int *type::specialInt; 

該定義將然後由所有人通過type.h找到並使用。

1

我讀關鍵字static允許變量具有外部連接,

否,當static使用具有在名字空間域中的對象時,它指定內部連接。這意味着,在Branch.cpp中指定的specialInt和在Leaf.cpp中打印的specialInt不是同一個對象。

3)...當在名稱空間範圍的聲明中使用時,它指定 內部鏈接。