草庐IT

c++ - 为什么需要类型转换 (UINT)(void*)(DWORD)?

这个问题不太可能帮助任何future的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visitthehelpcenter.关闭9年前。这是MFC的CMap类中的默认HashKey函数。AFX_INLINEUINTAFXAPIHashKey(ARG_KEYkey){  //defaultidentityhash-worksformostprimitivevalues  return((UINT)(void*)(DWORD)key)>>4;}我的问题是为什么需要类型转换(DWORD)和(vo

c++ - 转化和推广是一回事吗?

我不确定提升是否仅仅意味着将数据类型转换为更大的数据类型(例如short到int)。或者提升是否意味着将数据类型转换为另一种“兼容”数据类型,例如将short转换为int,这将保持相同的位模式(额外的空间将用零填充)。转换是否意味着将int之类的东西转换为float,这将创建一个完全不同的位模式? 最佳答案 有两种东西叫促销:积分促销和浮点促销。整数提升是指整数类型(包括位域和枚举)被转换为“更大”的整数类型,而浮点提升具体只是float到double。这两种类型的促销都是更广泛转化的子集。char->int:积分提升float->

c++ - 在 C++ 中应该使用什么来检查身份?

我有两个指向对象的指针,我想以最稳健的方式测试它们是否是完全相同的对象。我明确不想调用任何operator==重载,我希望它无论使用什么基类、虚拟基类和多重继承都能正常工作。我目前的代码是这样的:((void*)a)==((void*)b)对于我来说,这是有效的。但是,这不适用于这种情况:classB1{};classB2{};classC:publicB1,publicB2{}Cc;B1*a=&c;B2*b=&c;在reinterpert_cast、static_cast或dynamic_cast中替换也不起作用。特别是我希望最终能变得非常简单和高效。理想情况下,它不需要任何分支指令

c++ - Objective-C 和 C++ 之间的转换比较

好的,所以这可能是一个学术问题。谁能告诉我C++的转换运算符是否/如何转换为Objective-C...或者它们如何/为什么不需要?我已经脱离C++的圈子几年了,似乎每次我转身他们都会添加一些新的关键字。我最近了解到C++的各种转换运算符reinterpret_cast、static_cast、dynamic_cast和const_cast。我不太清楚何时会出现需要使用所有这些类型的强制转换的情况。我现在已经使用Objective-C一两年了,对它感觉相当舒服。(在那之前主要是C人)。我试图理解为什么C++似乎具有所有这些复杂性。或者换句话说,Objective-C缺少什么它似乎没有(

c++ - 带有 "const"关键字的 C 类型转换

我通常在C/C++代码中使用C类型转换。我的问题是,在转换类型中添加“const”关键字对结果有什么意义吗?比如我可以想出几个场景:constmy_struct*func1(){my_struct*my_ptr=newmy_struct;//modifymembervariablesreturn(constmy_struct*)my_ptr;//returnmy_instance;}在这个函数中,函数构造了一个结构的新实例,并将其转换为一个常量指针,因此调用者将无法进一步修改其内部状态,除非删除它。“const”转换是必需的、推荐的还是根本不需要的,因为任一return语句都有效。在这

c++ - 定义明确的缩小铸型

我正试图想出一个优雅地忽略丢失数据的缩小转换(通用解决方案)。在VisualStudio中,丢失数据的缩小转换会触发“运行时检查失败#1”。我不想关闭它,而是尝试实现一个narrow_cast,它可以优雅地进行缩小转换并且不会触发运行时检查。VisualStudio建议:charc=(i&0xFF);所以我从这个开始,想出了这个丑陋的解决方案:templatestructnarrow_mask{staticconstTvalue=T(0xFFFFFFFFFFFFFFFF);};templateTnarrow_cast(constU&a){returnstatic_cast(a&narr

c++ - 将 `unsigned char` 放入 `char`

我想通过移位将一个unsignedchar存储到一个char中。由于这两种数据类型具有相同的长度(在我的机器上为1个字节),我希望以下代码能够工作:#include#include#includeusingnamespacestd;intmain(){printf("%d\n",sizeof(char));printf("%d\n",sizeof(unsignedchar));unsignedchartest=49;chartestchar=(char)(test-127);printf("%x\n",testchar);return0;}但事实并非如此。特别是,我得到了以下输出:11

c++ - 是否使用 const_cast 对 const 对象进行只读访问?

在C++中,我有一个函数只需要对数组进行只读访问,但被错误地声明为接收非常量指针:size_tcountZeroes(int*array,size_tcount){size_tresult=0;for(size_ti=0;i我需要为常量数组调用它:staticconstintArray[]={10,20,0,2};countZeroes(const_cast(Array),sizeof(Array)/sizeof(Array[0]));这会是未定义的行为吗?如果是这样-程序何时会遇到UB-在执行const_cast和调用函数时或在访问数组时? 最佳答案

c++ - 哪种转换是从 Type* 到 void*?

在C++中,对于任何数据类型,我都可以执行以下操作:Type*typedPointer=obtain();void*voidPointer=typedPointer;当我将Type*分配给void*时执行哪个转换?这和Type*typedPointer=obtain();void*voidPointer=reinterpret_cast(typedPointer);还是其他Actor? 最佳答案 这是一个标准的指针转换。由于它是标准转换,因此不需要任何显式转换。如果您想使用显式转换重现该转换的行为,则应使用static_cast,而

c++ - 关于从基类到子类指针的向下转型

静态检查工具显示了以下代码的违规行为:classCSplitFrame:publicCFrameWnd...classCVsApp:publicCWinAppCWnd*CVsApp::GetSheetView(LPCSTRWindowText){CWnd*pWnd=reinterpret_cast(m_pMainWnd)->m_OutputBar.GetChildWnd(WindowText);returnpWnd;}错误信息:“CSplitFrame”类继承自“CWnd”类描述:避免向下转换继承层次。此规则检测从基类指针到子类指针的转换。好处:允许向下转换继承层次结构会导致维护问题,