Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >将c样式强制转换为正确的c++强制转换

将c样式强制转换为正确的c++强制转换
EN

Stack Overflow用户
提问于 2018-03-01 18:24:39
回答 2查看 122关注 0票数 0

在一些代码中得到了这个序列。希望将函数调用中的c样式强制转换转换为c++样式强制转换。

代码语言:javascript
代码运行次数:0
复制
char* messageBuffer{ nullptr };
const unsigned long size{ FORMAT_MESSAGE(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    0,
    errorMessageID,
    MAKELANGID(LANG_NEUTRAL | SUBLANG_DEFAULT),
    (char*)&messageBuffer,    // this the one want to change
    0,
    0
)};

谢谢

编辑:为清晰起见添加了winapi标记

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 18:29:18

守则将是:

代码语言:javascript
代码运行次数:0
复制
reinterpret_cast<char *>(&messageBuffer)

如果读者有疑问的话,是的,带有标志FormatMessageA的Windows函数FORMAT_MESSAGE_ALLOCATE_BUFFER实际上指定了这个用法。

请注意,如果正在使用FormatMessageW,则转换为wchar_t *。我们无法分辨,因为您已经隐藏了这个宏FORMAT_MESSAGE后面的函数名。

如果在Windows API编程中使用普通文本宏,则可以使用:

代码语言:javascript
代码运行次数:0
复制
reinterpret_cast<LPTSTR>(&messageBuffer)

并且可能还应该声明messageBuffervoid *messageBuffer;LPTSTR messageBuffer;

票数 2
EN

Stack Overflow用户

发布于 2018-03-01 19:00:45

策略的存在通常是有原因的,在C上使用C++强制转换有两个原因。

  1. 他们更安全/更严格,因为他们更了解类型。
  2. 与C转换不同,它们很容易进行文本搜索。

如果你只是为了遵守公司的政策而在reinterpret_cast上打了一个耳光,那么第一大部分都会从窗口掉下来。

我个人会保留C强制转换,因为当设置了某个标志时,API需要在那里进行转换,但我也会尝试使其类型安全并尽可能严格,例如

代码语言:javascript
代码运行次数:0
复制
(LPTSTR)const_cast<LPTSTR*>(&messageBuffer)

但是,如果策略没有任何回旋余地,那么您可以将其完全C++化。

代码语言:javascript
代码运行次数:0
复制
reinterpret_cast<LPTSTR>(const_cast<LPTSTR*>(&messageBuffer))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49061847

复制
相关文章
C++强制类型转换
  C++中的强制类型转换虽然兼容C语言中的强制类型转换,但是不建议在C++中使用C语言风格的强制类型转换。C++中的强制类型转换共有4种:static_cast,dynamic_cast、const_cast、reinterpret_cast.
全栈程序员站长
2022/07/14
1.3K0
2.2 C++强制类型转换
在C++的表达式中,不同的数据类型会自动地转换类型进行运算,但有的时候也需要程序员自己进行强制类型转换,将某个表达式转换成自己所需要的数据类型。
小林C语言
2020/10/30
7200
C++的四种强制转换
        C++中的四种转换,是一个老生常谈的话题。但是对于初学者来说,该如何选择哪种转换方式仍然会有点困惑。而且我总是觉得“纸上得来终觉浅”,于是便“绝知此事要躬行”。于是利用闲暇时光,整理一下reinterpret_cast、const_cast、static_cast和dynamic_cast这四种强制转换的相关知识。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
2.3K0
【专业知识】C++的强制类型转换
C 风格(C-style)强制转换一般用(类型修饰)来转换类型。C++则有自己的转换方式 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterdivt_cast、和const_cast。 1、static_cast 用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换。
程序员互动联盟
2018/03/12
1.1K0
C++:16---强制类型转换和类型转换
旧式的强制类型转换 在早期C/C++中,显式地进行强制类型的转换有以下两种形式: type (expr) ; //函数形式的强制类型转换 (type) expr; //C语言风格的强制类型转换 比如: char c = '12'; int b = (int)c; float f = float(b); C++的新式强制类型转换 命名的强制类型转换具有如下形式: cast-name<type> (expr); cast-name可以是
用户3479834
2021/02/03
2K0
C++ 强制类型转换和赋值中的类型转换
需要注意的是:如果强制类型转换的对象是一个变量,那么该变量不需要用括号括起来;但是如果对象是一个包含多项的表达式,则表达式应该用括号括起来。
chaibubble
2022/05/07
1.6K0
C++学习——数据类型(强制)转换详解
如果将一个浮点值分配给一个 int 整型变量,该变量会接收什么值?如果一个 int 整数乘以一个 float 浮点数,结果将会是什么数据类型?如果一个 double 浮点数除以一个 unsigned int 无符号整数会怎么样?是否有办法预测在这些情况下会发生什么?
全栈程序员站长
2022/09/23
1.8K0
C语言-强制类型转换
强制类型转换这个东西非常频繁的被使用,而且如果用的好的话,会非常的爽,我写个简单的例子。
用户8639654
2021/07/21
2.3K0
【C语言】强制类型转换的原理
解释代码: 这样的代码虽然能编译的过去,但其实是有不妥当的地方的,但平常我们在做题的时候难免遇到这样的代码风格,所以我们在这里解释一下这样的代码,但希望大家还是不要写出这样的代码来,这样的代码风格其实是不好的
举杯邀明月
2023/04/12
1.3K0
【C语言】强制类型转换的原理
C语言编程—强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型,如下所示:
芯动大师
2023/10/14
3220
C语言编程—强制类型转换
[计组]强制类型转换
不改变数值内容,改变解释方式,一般是负数时会出问题,因为符号位是1,转成无符号位时会被当成数据内容
唯一Chat
2021/01/08
1.9K0
C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。
Tencent JCoder
2022/05/06
6210
C++强制类型转换操作符 dynamic_cast
C++强制类型转换操作符 const_cast
const_cast也是一个强制类型转换操作符。《C++ Primer》中是这样描述它的:
Tencent JCoder
2022/05/06
3200
C++强制类型转换操作符 const_cast
C语言的数据的强制类型转换
       强制类型转换算是C语言中常见常考的一项内容,如对于类型处理不好,将会产生错误结果。对于某些类型的转换编译器可隐式地自动进行,不需人工干预,称这种转换为自动类型转换;而有些类型转换需要编程者显式指定,通常,把这种类型转换称为强制类型转换
Twcat_tree
2022/11/30
1.2K0
C语言的数据的强制类型转换
C++强制类型转换操作符 static_cast
static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。本节介绍static_cast操作符。
Tencent JCoder
2022/05/06
5290
C语言面试之——地址的强制转换
这里(int)i_a是把数组i_a的值转换为int类型的数值,而不是地址,然后再加1,如上图所示,ptr1_pi[-1]的值大家应该知道,就是数组i_a的下一个数组,在返还一个数组元素,就指向了i_a[4]了,这个不难,ptr2_pi的值一目了然了吧,再截个图:
用户4645519
2020/09/07
1.5K0
C语言面试之——地址的强制转换
如何正确的将数组转换为ArrayList?
对于不可变集合,你可以使用ImmutableList类及其of()与copyOf()工厂方法:(参数不能为空)
崔笑颜
2020/06/08
3.4K0
php强制类型转换
<?php $b="666"; echo "<br />"; var_dump((int)$b); 解读:字符串转换成了整型
贵哥的编程之路
2022/03/25
4.3K0
php强制类型转换
js强制类型转换
Number和Object比较,是Number与 Object调用ToPrimitive()之后的结果 比较
xinxin-l
2022/03/29
5.7K0
(十九)类型强制转换
这种情况适合我们明确知道某个 变量 或者 参数 的情况下,但是 TypeScript 无法自动推断,而把他转换为不兼容的类型
老怪兽
2023/02/22
9030

相似问题

将复杂的C++强制转换转换为C#

12

将指针的C样式数组强制转换为const

144

C++强制转换为基类

10

C/C++强制转换为常量怪异

40

C++:将空指针转换/强制转换为结构引用

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文