我在理解爲什麼我的代碼按照它的工作方式工作(或不按照它的工作方式)時遇到了一些麻煩。我想寫一個接口,允許使用一些在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
- 這意味着在地圖上之前某處消失test
的main
。
我在想這可能是某種static initialization order fiasco,但是我沒有找到附加的解決方案非常有幫助,因爲我沒有明確地調用test.cc
中的project.cc
文件中的對象。
我將不勝感激這個問題的任何幫助。
您是否打算將'dummy'聲明爲'static unsigned long'? –
我很好奇:你爲什麼要求C鏈接添加和give_size? – jbruni
再次嘗試鏈接參數中給出的'-std = C++ 11'?有關靜態對象初始化的規範在C++ 11中進行了更改。 –