如何在不使用 reinterpret_cast 的情况下将字符串转换为 const unsigned char*(现代方法)
How to convert string to const unsigned char* without using reinterpret_cast (modern approach)
我有变量 input
类型 const std::string&
:
const std::string& input
现在我需要将其转换为 const unsigned char*
因为这是函数的输入。
现在我有了正确的转换代码:
reinterpret_cast<const unsigned char*>(input.c_str())
这很好用,但在 clang 中我收到警告:
do not use reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast]
将 string
或 const char*
更改为 const unsigned char*
的正确方法是什么?
编辑
显然,联合双关语是 UB,所以 绝对 不要这样做。
(尽管为后代保留答案!)
要严格回答你的问题,可以这样:
void foo(const unsigned char* str) {
std::cout << str << std::endl;
}
int main()
{
std::string word = "test";
//foo(word.data()); fails
union { const char* ccptr; const unsigned char* cucptr; } uword;
uword.ccptr = word.data();
foo(uword.cucptr);
}
这比 reinterpret_cast
好吗?应该不是。
What is the correct way to change a string or const char* to const unsigned char*?
正确的方法是使用reinterpret_cast。
如果你想避免reinterpret_cast,那么你必须完全避免指针转换,这只有解决XY问题才有可能。部分选项:
- 您可以首先使用
std::basic_string<unsigned char>
。
- 如果您只需要一个指向 unsigned char 的迭代器而不一定是一个指针,那么您可以使用
std::ranges::views::transform
,它对每个元素使用静态转换。
- 您可以更改期望
unsigned char*
接受 char*
的函数。
如果您不能更改 input
的类型并且确实需要 unsigned char*
并且您仍然必须避免重新解释转换,那么您可以使用转换从输入创建 std::basic_string<unsigned char>
看法。但这有潜在的开销,因此请考虑避免 reinterpret_cast 是否值得。
我有变量 input
类型 const std::string&
:
const std::string& input
现在我需要将其转换为 const unsigned char*
因为这是函数的输入。
现在我有了正确的转换代码:
reinterpret_cast<const unsigned char*>(input.c_str())
这很好用,但在 clang 中我收到警告:
do not use reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast]
将 string
或 const char*
更改为 const unsigned char*
的正确方法是什么?
编辑
显然,联合双关语是 UB,所以 绝对 不要这样做。
(尽管为后代保留答案!)
要严格回答你的问题,可以这样:
void foo(const unsigned char* str) {
std::cout << str << std::endl;
}
int main()
{
std::string word = "test";
//foo(word.data()); fails
union { const char* ccptr; const unsigned char* cucptr; } uword;
uword.ccptr = word.data();
foo(uword.cucptr);
}
这比 reinterpret_cast
好吗?应该不是。
What is the correct way to change a string or const char* to const unsigned char*?
正确的方法是使用reinterpret_cast。
如果你想避免reinterpret_cast,那么你必须完全避免指针转换,这只有解决XY问题才有可能。部分选项:
- 您可以首先使用
std::basic_string<unsigned char>
。 - 如果您只需要一个指向 unsigned char 的迭代器而不一定是一个指针,那么您可以使用
std::ranges::views::transform
,它对每个元素使用静态转换。 - 您可以更改期望
unsigned char*
接受char*
的函数。
如果您不能更改 input
的类型并且确实需要 unsigned char*
并且您仍然必须避免重新解释转换,那么您可以使用转换从输入创建 std::basic_string<unsigned char>
看法。但这有潜在的开销,因此请考虑避免 reinterpret_cast 是否值得。