[英]Cast an array of strings to an array of char*
我试图摆脱ISO C++ forbids converting a string constant to 'char*'
警告,我的代码如下所示:
char* var[] = {"abc", "def"};
// many more lines like this ...
一种解决方案是在每个字符串文字前加上(char*)
,但这很丑陋且无法维护。 理想情况下,我希望能够编辑这些行来说
char* var[] = array_cast<char*>({"abc", "def"});
我在这里找到了几乎相同问题的解决方案,除了它处理std::array
而不是普通的 C arrays 和数组变量而不是初始化列表。
我想避免使用std::array
、 std::string
、 const char*
、 std::vector
因为最终被调用的函数接受非 const char**
。
C 字符串字面量是常量,会放在.data段中,防止被硬件修改。 没有多少演员可以解决这个问题。
C++ 字符串 ( std::string
) 是可变的,所以使用那些:
#include <string>
using namespace std::literals;
std::string var[] = {"abc"s, "def"s};
虽然我不明白为什么你会想要数组中的可变字符串。
"abc"
和"def"
是const char[4]
类型的字符串文字,由于类型 decay而衰减为const char*
(而不是char*
)。
因此,您需要添加一个低级const
来指示var
是一个指向const char
的指针数组(而不是指向char
的指针),如下所示:
const char* var[] = {"abc", "def"};
或者更好的是将std::array
或std::vector
与std::string
类型的元素一起使用。
std::vector<std::string> var{"abc", "def"};
作为一种可能的解决方法,可以使用两个 arrays,一个带有std::string
对象,另一个带有指向第一个数组中字符串的char*
指针:
std::array<std::string, 2> real_strings = {{ "foo", "bar" }};
char* wrap[] = { &real_strings[0][0], &real_strings[1][0] };
如果在编译时不知道字符串的数量(或者可能在运行时改变),这当然可以与向量和动态分配以及循环一起使用来初始化包装器数组。
就个人而言,对我来说,这似乎是您正在使用的 API 中的设计缺陷。
我已经找到了解决方案。 它需要两个 arrays 其中一个需要事后清理,因此肯定可以改进。
template<size_t N, size_t... Is>
constexpr char**
array_cast(const std::array<const char*, N>& arr, std::index_sequence<Is...>)
{
return new char*[]{const_cast<char*>(std::get<Is>(arr))...};
}
template<size_t N>
constexpr char**
array_cast(const std::array<const char*, N>& arr)
{
return array_cast(arr, std::make_index_sequence<N>());
}
const std::array var {"abc", "def"};
char** result = array_cast(var);
您可以像这样创建一个可修改的二维字符数组:
char var[][4] = {"abc", "def"};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.