Я строю свою программу (на самом деле тесты), используя статическую библиотеку.
Эта библиотека содержит один файл, внутри которого у меня есть такие функции:
string& GetString() {
static string strFilename;
return strFilename;
}
void PrintToScreen() {
printf("String: %s\n", GetString().c_str())
}
Затем в моем main.cpp (вне библиотеки) я делаю:
GetString() = "abc";
printf("String: %s\n", GetString().c_str());
PrintToScreen();
И я получаю этот вывод:
String: abc
String:
Так выглядит второй вызов функции
(но сделано из другого файла, который находится внутри библиотеки)
каким-то образом очистить предыдущее значение, повторно инициализировать его или использовать собственную копию.
Я изменил функцию GetString, чтобы использовать 'new', но результат точно такой же (кстати, программа никогда не падает).
Но я не понимаю, горячо это возможно?
Есть идеи, что я делаю не так?
------------------------------- ОБНОВЛЕНИЕ --------------- ---------------
- Испытание выполнено в однопоточной среде.
- Он работает на некоторых платформах, а на некоторых - нет (работает на Windows, MacOS и AIX, не работает на Linux, HP_UX, Solaris, FreeBSD ...)
- Я проверял адрес имени strFilename во время выполнения (printf внутри GetString) и похоже, что это одна переменная без дубликатов (адрес всегда один и тот же)
- НО, с nm на финальной lib я получаю что-то вроде этого:
0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile
U _Z16GetLogprintfFilev
и с nm на моей базовой lib (используется final lib) я получаю:
0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile