У меня небольшие проблемы с пониманием того, почему мой код работает так, как он работает (или не работает так, как должен).
Я пытаюсь написать (на C++) интерфейс, который позволяет использовать некоторые функции, работающие с unordered_map
, из стандартной библиотеки шаблонов в C. Однако я также хотел бы написать пространство имен, которое позволяет использовать их и в 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;
}
Интерфейс для С++:
//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
, а это значит, что карта исчезает где-то раньше main
test
.
Я думал, что это может быть своего рода фиаско статического порядка инициализации, однако Я не нахожу прилагаемое решение очень полезным, так как я не вызываю явно объекты из файла project.cc
в test.cc
.
Буду признателен за любую помощь в этом вопросе.
dummy
static unsigned long
? - person Jared Dykstra   schedule 11.11.2015-std=c++11
, указанным в аргументе ссылки? Спецификация инициализации статических объектов изменилась в C++11. - person M.M   schedule 07.12.2015