2015-11-11 33 views
1

我在理解爲什麼我的代碼按照它的工作方式工作(或不按照它的工作方式)時遇到了一些麻煩。我想寫一個接口,允許使用一些在C中的標準模板庫unordered_map上運行的函數。但是,我也想寫一個命名空間,允許使用它們在C++也是如此。在主之前使用來自不同文件的變量

我在問的不是如何以不同的方式改變它,而是它爲什麼會按照它的方式工作;

讓我們假設我只需要兩個函數:添加元素並寫出地圖的大小。該首標是如下:

//project.h 
#ifdef __cplusplus 
extern "C" { 
#endif 

void add(int, int); 

void give_size(); 

#ifdef __cplusplus 
} 
#endif 

的源代碼:

//project.cc 
#include <unordered_map> 
#include <iostream> 
#include "project.h" 

using namespace std; 

unordered_map<int, int> my_map; 

void add(int arg, int val) { 
    my_map.insert ({{arg, val}}); 
} 

void give_size() { 
    cout << my_map.size() << endl; 
} 

用於C++接口:

//cproject 
namespace pro { 
    #include "project.h" 
} 

和測試:

//test.cc 
#include "cproject" 
namespace { 
    unsigned long test() { 
     ::pro::add(1,2); 
     ::pro::add(3,4); 
     return 0; 
    } 
    unsigned long dummy = test(); 
} 
int main() { 
    ::pro::give_size(); 
    return 0; 
} 

而且,對於完整性,Makefile

g++ -Wall -std=c++11 -c -o project.o project.cc 
g++ -Wall -std=c++11 -c -o test.o test.cc 
g++ test.o project.o -o test 

問題是,當然,在運行test輸出0代替2 - 這意味着在地圖上之前某處消失testmain

我在想這可能是某種static initialization order fiasco,但是我沒有找到附加的解決方案非常有幫助,因爲我沒有明確地調用test.cc中的project.cc文件中的對象。

我將不勝感激這個問題的任何幫助。

+0

您是否打算將'dummy'聲明爲'static unsigned long'? –

+0

我很好奇:你爲什麼要求C鏈接添加和give_size? – jbruni

+0

再次嘗試鏈接參數中給出的'-std = C++ 11'?有關靜態對象初始化的規範在C++ 11中進行了更改。 –

回答

2

是的,這是命名不當的靜態初始化命令失敗。由於C++標準稱之爲「動態初始化」,因此命名不當; 「靜態初始化」有些不同。

這意味着地圖之前測試的主要

不太某處消失。問題是你在之前使用地圖,給它添加值。現在,對於某些映射實現而言,零初始化狀態(這是在任何動態初始化器運行之前對所有全局變量執行的操作)與缺省構造函數的作用相同。因此,test中的代碼首先被執行並嘗試添加東西到地圖中,並且地圖的插入功能工作得很好,創建節點,設置節點的內部指針等。

然後地圖的實際默認構造函數運行,將這些指針重置爲空,泄漏並忘記您創建的所有節點。您之前的插入操作已被撤消,並且地圖再次爲空。

鏈接中提供的解決方案可以正常工作;即使你沒有明確地做,你也可以通過自由函數隱式地調用對象。沒有真正的區別。您仍然使用返回對函數級靜態(或指針,取決於您選擇的確切解決方案)的引用的函數替換project.cc中的全局my_map。唯一的區別是,您不是在test.cc中調用此函數,而是從addgive_size中調用此函數。

作爲一個側面說明,這整個全球性的國家事情通常是相當可疑的。它不是線程安全的,它使得更難理解程序在做什麼。考慮不要這樣做。

+0

謝謝,這非常有幫助。公平地說,那不是我的想法,我正在爲C++大學課程學習,這往往會提供不切實際的問題,並建議解決它們的最不方便的方法;-) – Jytug

+0

@Jttug你不是不切實際可能遇到這樣的代碼。我只希望你永遠不要寫它。 –

相關問題