저는 도서관을 쓰고 있으며 "Macros are evil"이라는 오래된 격언을 기억하면서 가능한 한 C++ 중심으로되고 싶었습니다. 소스 파일에서 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되었습니다. gdb를 사용하여 문제를 추적하고 충격/공포에 대해 문자열 변수 DATA_DIR_ENV_STR 및 DFLT_DATA_DIR은 정적 변수 초기화 중에 액세스되었을 때 아직 초기화되지 않았습니다.
결국 매크로를 사용하여 문제를 해결했습니다. 하지만 궁금한 점은 'static variable initialization fiasco'의 변형입니까? 매크로를 사용하지 않고도이를 해결할 수있는 또 다른 방법이 있습니까?
, 당신은 당신이 돈을받을 :
귀하의 다른 옵션을 사용하여이를 반환하는 기능을 할 것이다. – Puppy