首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套static_cast和const_cast

嵌套static_cast和const_cast
EN

Stack Overflow用户
提问于 2018-07-09 15:30:58
回答 2查看 446关注 0票数 1

我有一个系统呼叫,如下所示:

代码语言:javascript
复制
int transfer(int handle, int direction, unsigned char *data, int length);

我编写了以下两项功能:

代码语言:javascript
复制
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中的嵌套static_cast,是否有一种方法可以在一步内执行从const void*unsigned char*的转换?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-09 16:19:15

使用C样式的强制转换将生成相同的程序集。如编译器资源管理器中所示

代码语言:javascript
复制
//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-ness是有意的和需要的行为。代码维护者应该看到这些转换,并假定代码背后有意图,而不是猜测您是否知道直接从const void*unsigned char*的转换将涉及风险未定义的行为。您的示例可能不包含UB (因为您指定transfer的契约是在direction为0时将data视为只读),但重要的是,需要对代码进行更改的其他任何人都理解您的编码实践的慎重性。

票数 3
EN

Stack Overflow用户

发布于 2018-07-09 18:30:35

你不想让data不受约束。如果transfer试图修改它呢?更安全的做法是,有一份本地副本:

代码语言:javascript
复制
#include <cstring>
int output(int handle, const void* data, int length)
{
    unsigned char localData[length];
    std::memcpy(localData, data, length);
    return transfer(handle, 0, localData, length);
}

编辑:阅读评论,这是Shlublu的建议.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51249130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档