gpt4 book ai didi

C++ 字符串常量和静态变量初始化(或者只使用宏?)

转载 作者:行者123 更新时间:2023-11-30 00:40:56 24 4
gpt4 key购买 nike

我正在编写一个库,并希望尽可能以 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 在静态变量初始化期间被访问时尚未初始化。

最后我只是使用宏来解决这个问题。但是,我不禁想知道,这是“静态变量初始化惨败”的变体吗?有没有另一种方法可以在不使用宏的情况下解决这个问题?

最佳答案

是的,这就是静态初始化的惨败。

避免它的一种方法是“首次使用时构造”成语(大脑编译代码):

// In the header
class mySingleton {
private:
static mySingleton *s_instance;
mySingleton();
public:
mySingleton &instance() {
if (!s_instance)
s_instance = new mySingleton();
return *s_instance;
}
};

// And in the source file...
mySingleton *mySingleton::s_instance;

但是,对于字符串常量,您也可以使用简单的 char 指针:

static char const *const DATA_DIR_ENV_STR = "DATADIR";
static char const *const DFLT_DATA_DIR = "../data";

关于C++ 字符串常量和静态变量初始化(或者只使用宏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com