我想做以下事情:
std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" };
显然,它不起作用,因为我没有指定新数组的大小。在不计算字符串文字中的符号的情况下,实现目标的适当方法是什么?
也欢迎使用std::array
。
更新#1:即使我把数组的大小,它也无法正常工作。
更新#2:让非const 访问数组作为一个简单的char*
指针至关重要。
答案 0 :(得分:4)
以下是基于std::array
的解决方案:
std::array<char, sizeof("/tmp/file-XXXXXX")> arr{ "/tmp/file-XXXXXX" };
您可以使用宏来减少样板:
#define DECLARE_LITERAL_ARRAY(name, str) std::array<char, sizeof(str)> name{ str }
DECLARE_LITERAL_ARRAY(arr, "/tmp/file-XXXXXX");
sizeof
在编译时进行评估,因此没有文本字符串的运行时扫描来查找其长度。结果数组以null结尾,无论如何你可能想要它。
答案 1 :(得分:2)
由于您请求了动态数组并且不想计算长度,因此排除了std::array<char,N>
。你要求的只是std::string
- 它是动态的(如果需要的话),并且从char*
初始化得很好而不计算长度。在内部,它将字符串存储在一个平面数组中,因此您可以通过c_str()
调用来使用它。
答案 2 :(得分:1)
我不知道你为什么不使用std::string
;您可以str.empty() ? NULL : &str[0]
来获取非常量指针,因此str.c_str()
的常量不会造成问题。
但请注意,这不是以空值终止的。