如何将const uint8_t*转换为char*

Ker*_*ley 1 c++ casting

我有一个const uint8_t*我想要转换为一个char*期望a的接口char*.

最简单的方法是使用C风格的强制转换:

const uint8_t* aptr = &some_buffer;
char* bptr = (char*)aptr;
Run Code Online (Sandbox Code Playgroud)

但是,我们的内部样式指南(基于Google C++样式指南)禁止C样式转换.

另一种选择是这种怪异,我发现这是非常难以理解的:

char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(aptr));
Run Code Online (Sandbox Code Playgroud)

我尝试的其他选项都无法编译:

char* dptr = reinterpret_cast<char*>(aptr);
char* eptr = const_cast<char*>(aptr);
char* fptr = static_cast<char*>(aptr);
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以使用C++样式转换来执行此转换而不嵌套两个单独的转换操作?

Dre*_*ann 5

有没有什么方法可以使用C++样式转换来执行此转换而不嵌套两个单独的转换操作?

不便携,没有.没有单一的"类型是错的,而const也是错误的"演员.

另一种选择是这种怪异,我发现这是非常难以理解的:

char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(ptr));
Run Code Online (Sandbox Code Playgroud)

去做.

C++演员和你的内部风格指南都在努力使这看起来很怪异.

您可以通过编写自己的演员来防止重复演员.

template< typename T >
char* awful_monster_cast( const T * ptr )
{
    return reinterpret_cast<char*>(const_cast<T*>(ptr));
}
Run Code Online (Sandbox Code Playgroud)


Xir*_*ema 5

\n

另一种选择是这个怪物,我觉得它很难读:

\n
char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(aptr));\n
Run Code Online (Sandbox Code Playgroud)\n
\n

您可能会发现它不可读,但这是在 C++ 中表达此转换的惯用方式。

\n

重要的是:

\n
    \n
  • 您正在使用 C 风格的 API,无论出于何种原因,它本身并不是 const 正确的,但您希望尽可能保留自己代码的 const 正确性,因此需要进行强制转换以删除 cv 限定方式。
  • \n
  • C 风格 API 使用有符号数据类型,而您的应用程序则使用无符号数据类型。
  • \n
\n

总的来说,您的代码需要进行两次转换:\xe2\x80\x94,删除常量性,并转换为有符号类型。如果您想遵守这些编码实践,这要求您进行两次显式表达的转换。您可能不同意这个原则,但您的公司/编码实践肯定同意。

\n

当然,我认为没有什么可以阻止你写这样的东西:

\n
char * convert_to_c_data_buffer(uint8_t const* ptr) {\n    return reinterpret_cast<char*>(const_cast<uint8_t*>(ptr));\n}\n\nchar* dptr = convert_to_c_data_buffer(aptr);\n
Run Code Online (Sandbox Code Playgroud)\n