Я пишу библиотеку и хотел быть как можно более ориентированным на C ++, вспоминая старую поговорку «Макросы - это зло».
В исходном файле у меня были следующие определения:
const std::string DATA_DIR_ENV_STR = "DATADIR"
const std::string DFLT_DATA_DIR = "../data"
/*
#define DATA_DIR_ENV_STR "DATADIR"
#define DFLT_DATA_DIR "../data"
*/
std::string getRootDirectory()
{
char * datastr_ = getenv(DATA_DIR_ENV_STR);
if (datastr_)
return std::string(datastr_);
return DFLT_DATA_DIR;
}
// Заголовочный файл
std::string getRootDirectory();
У меня был одноэлементный класс, который был инициализирован так:
bool mySingleton::inited = mySingleton::initialize();
bool mySingleton::initialize(){
std::string rootdir = getRootDirectory(); // <-SEGV when using const std::string
}
Библиотека скомпилирована нормально, но когда я связывал с ней приложение, приложение всегда SEGV'd. Я использовал gdb для отслеживания проблемы и, к моему ужасу, строковые переменные DATA_DIR_ENV_STR и DFLT_DATA_DIR еще не были инициализированы, когда к ним обращались во время инициализации статической переменной.
В конце концов, я просто использовал макросы, чтобы обойти эту проблему. НО, я не могу не задаться вопросом, это разновидность «фиаско инициализации статической переменной»? Есть ли другой способ решить эту проблему без использования макросов?