C++ 初始化关于googlec+的静态字符串(C-type或std::string)+;风格指南
根据,“静态和全局变量”一节声称:“因此,我们只允许静态变量包含POD数据。该规则完全不允许C++ 初始化关于googlec+的静态字符串(C-type或std::string)+;风格指南,c++,static,stdstring,C++,Static,Stdstring,根据,“静态和全局变量”一节声称:“因此,我们只允许静态变量包含POD数据。该规则完全不允许std::vector(使用C数组)或string(使用const char[])。”假设我的程序需要一些静态字符串,这些字符串存储在配置文件中,并将在运行时加载。那么如何才能将字符串加载到常量字符[]?您必须在编译时指定字符串的长度。在执行之前,您需要知道字符串的最大长度 鉴于长度: const std::size_t len = 2048; // can store 2047 characters
std::vector
(使用C数组)或string
(使用const char[]
)。”假设我的程序需要一些静态字符串,这些字符串存储在配置文件中,并将在运行时加载。那么如何才能将字符串加载到常量字符[]
?您必须在编译时指定字符串的长度。在执行之前,您需要知道字符串的最大长度
鉴于长度:
const std::size_t len = 2048; // can store 2047 characters with null-terminating '\0'
你可以用c风格来做这件事
char buffer[len];
或者更好地使用std::array
#include <array>
std::array<char,len> buffer;
#包括
std::数组缓冲区;
然后将文件打开到ifstream中,并适当地解析数据。您必须在编译时指定字符串的长度。在执行之前,您需要知道字符串的最大长度 鉴于长度:
const std::size_t len = 2048; // can store 2047 characters with null-terminating '\0'
你可以用c风格来做这件事
char buffer[len];
或者更好地使用std::array
#include <array>
std::array<char,len> buffer;
#包括
std::数组缓冲区;
然后将文件打开到ifstream中,并适当地解析数据。配置文件中存储了字符串,这一事实对如何加载它没有任何影响。您可以将数据加载到
const char[]
或std::string
或任何其他位置,具体取决于您在特定情况下的方便程度
规则只是不允许非POD全局/静态变量。。。就是这样。配置文件中存储了一个字符串,这一事实对如何加载它没有任何影响。您可以将数据加载到
const char[]
或std::string
或任何其他位置,具体取决于您在特定情况下的方便程度
规则只是不允许非POD全局/静态变量。。。就是这样。 < p>忽略谷歌C++风格指南的优点,你可能会把它存储在<代码> const char */Cux>变量中,通过动态分配得到指针:
static const char *my_static_string = nullptr;
...
void load_static_string()
{
if(!my_static_string)
{
std::string str = //Read string from file.
my_static_string = new char[str.size() + 1];
strncpy(my_static_string, str.data(), str.size() + 1);
}
}
<>忽略谷歌的C++风格指南的优点,你可能会把它存储在<代码> const char */Cux>变量中,通过动态分配得到指针:
static const char *my_static_string = nullptr;
...
void load_static_string()
{
if(!my_static_string)
{
std::string str = //Read string from file.
my_static_string = new char[str.size() + 1];
strncpy(my_static_string, str.data(), str.size() + 1);
}
}
确实如此(而且是一个很好的例子)。在这一节的最后一句话中,他们有类似的情况:“如果你需要一个静态类型或全局变量的类类型,考虑初始化一个指针(它永远不会被释放),从你的主函数(或从pthRead on)()中,注意这必须是一个原始指针,而不是一个“智能”。“指针,因为智能指针的析构函数将具有我们试图避免的析构函数问题的顺序。”确切地说(也是很好的例子)。在这一节的最后一句中,它们有类似的情况:“如果需要类类型的静态变量或全局变量,请考虑初始化指针(这将永远不会被释放)。来自main()函数或pthread_once()。请注意,这必须是原始指针,而不是“智能”指针,因为智能指针的析构函数将具有我们试图避免的析构函数问题顺序。”