gpt4 book ai didi

c++ - 嵌套的 static_cast 和 const_cast

转载 作者:行者123 更新时间:2023-11-30 02:19:06 26 4
gpt4 key购买 nike

我有一个像下面这样的系统调用:

int transfer(int handle, int direction, unsigned char *data, int length);

我写了下面两个函数:

int input(int handle, void* data, int length)
{
return transfer(handle, 1, static_cast<unsigned char*>(data), length);
}

int output(int handle, const void* data, int length)
{
return transfer(handle, 0, static_cast<unsigned char*>(const_cast<void*>(data)), length);
}

我不喜欢 static_cast 中嵌套的 const_cast,有没有办法执行从 const void*unsigned char* 一步到位?

最佳答案

使用 C 风格的转换将生成相同的程序集。 As seen in Compiler Explorer :

//Source #1
int transfer(int handle, int direction, unsigned char *data, int length);
int input(int handle, void* data, int length)
{
return transfer(handle, 1, static_cast<unsigned char*>(data), length);
}

int output(int handle, const void* data, int length)
{
return transfer(handle, 0, static_cast<unsigned char*>(const_cast<void*>(data)), length);
}

//Source #2
int transfer(int handle, int direction, unsigned char *data, int length);
int input(int handle, void* data, int length)
{
return transfer(handle, 1, (unsigned char*)data, length);
}

int output(int handle, const void* data, int length)
{
return transfer(handle, 0, (unsigned char*)data, length);
}

//Assembly (both)
input(int, void*, int):
mov ecx, edx
mov rdx, rsi
mov esi, 1
jmp transfer(int, int, unsigned char*, int)
output(int, void const*, int):
mov ecx, edx
mov rdx, rsi
xor esi, esi
jmp transfer(int, int, unsigned char*, int)

很明显,只需使用 C 风格的转换就可以解决您的问题。

但是,您不应该使用 C 风格的转换

C++ 强制转换冗长的原因是为了确保您不会犯错误。当维护人员看到您的代码时,他们看到 const_caststatic_cast 很重要,因为以这种方式编写代码会告知读者丢弃 const-指针的本质是有意和期望的行为。代码维护者应该看到这些转换,并假定代码背后有意图,而不必猜测您是否知道直接从 const void* 转换为 unsigned char* 会涉及未定义行为的风险。您的示例可能不包含 UB(因为您指定 transfer 的契约(Contract)是在 direction 为 0 时将 data 视为只读),但重要的是,任何其他需要更改您的代码的人都必须了解您的编码实践是经过深思熟虑的。

关于c++ - 嵌套的 static_cast 和 const_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51249130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com