[英]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.