草庐IT

c++ - 在 C++ 中放松 void * 转换

在C中,将指针转换为void*不是错误。移植到C++的一个主要障碍是在从处理通用指针的函数返回时需要转换指针,例如malloc,以及在我自己的代码中声明的函数,例如void*block_get(Blknoconstblkno);.然而,我的代码旨在由C和C++编译器成功编译。如果我为了C++的缘故在任何地方都提供显式强制转换,它们必须是C风格的强制转换,并且我可能会屏蔽由于将非指针类型与两种语言的指针类型进行强制转换而产生的错误。我的引用错误如下:structCpfs*cpfs=calloc(1,sizeof(*cpfs));在MSVC中生成:Error2errorC2440:'ini

c++ - 关于 C++ 中的转换运算符的一些疑问

我们所知道的reinterpret_cast可以将任何指针类型转换为任何另一种指针类型。关于这个cast运算符,我想问的问题是:reinterpret_cast是如何工作的,允许reinterpret_cast工作的魔法(内部实现)是什么?使用reinterpret_cast时如何保证安全?据我所知,它不能保证安全转换,那么在使用reinterpret_cast时要采取什么预防措施?这个运算符的实际用法是什么。在我的专业编程经验中,我还没有真正遇到过它,如果不使用这个运算符,我就无法绕过它。除了通常的int*到char*之外,任何实际示例都会非常有帮助和赞赏。关于一般类型转换运算符的另

C++ 转换运算符和传统的 C 转换运算符

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Whenshouldstatic_cast,dynamic_castandreinterpret_castbeused?我做了很多谷歌搜索以找到:为什么要使用C++转换运算符而不是传统的C风格转换运算符?何时使用C++转换运算符,一些实例?以下是我发现的:传统上,任何C++转换运算符都用于更好地维护您的代码(即)我们可以通过搜索这种复杂的符号(reinterpret_cast现在让我简要说明每个C++转换运算符的原因和时间static_cast:为什么要使用它而不是C风格的转换?static_cast用于进行

c++ - 类有虚函数吗? C++

这个问题在这里已经有了答案:Testwhetheraclassispolymorphic(5个答案)关闭8年前。因此我有一个类,想判断它是否有虚函数。我考虑的第一种方式是动态转换。classA{//hiddendetails..};classB:publicA{};intmain(){A*a=newA;;B*b=dynamic_cast(a);}所以这种情况下如果A类中有虚函数,编译就会成功,否则会出现这个错误:error:cannotdynamic_cast\u2018a\u2019(oftype\u2018classA*\u2019)totype\u2018classB*\u201

c++ - 如何使用 boost::any_cast 转换为基本类型?

我正在使用boost::any来获得多态类型,我需要能够将对象转换为其基类型。classA{public:intx;virtualintfoo()=0;};classB:publicA{public:intfoo(){returnx+1;}};intmain(){B*bb=newB();boost::anyany=bb;bb->x=44;A*aa=boost::any_cast(any);}main函数的代码在运行时抛出如下错误:terminatecalledafterthrowinganinstanceof'boost::exception_detail::clone_impl>'w

c++ - 我应该使用它还是 static_cast<void*> 然后 static_cast<myType*> 来避免重新解释?

我看到有人建议使用static_cast(static_cast(p))而不是重新解释类型转换。我不明白为什么这样更好,谁能解释一下?为了便于讨论,这里有一个需要reinterpret_cast的示例场景:DWORDlpNumberOfBytes;ULONG_PTRlpCompletionKey;LPOVERLAPPEDlpOverlapped;GetQueuedCompletionStatus(myHandle,&lpNumberOfBytes,&lpCompletionKey,&lpOverlapped,0);if(lpCompletionKey==myCustomHandlerK

c++ - 某些 GL 函数的好奇 "void*"参数

对于OpenGL中的某些函数,必须为步长指定一个字节偏移量,例如在glVertexAttribPointer()中。起初我会猜测它会是一个像整数一样的普通数值。但经过检查,我意识到它需要转换为void*(更具体地说是GLvoid*)。我的问题是:void*的预期含义是什么,为什么必须将它用于字节偏移量? 最佳答案 glVertexAttribPointer()是VertexBufferObjects之前的一个旧函数。在VBO之前,您的顶点数据将存储在客户端数组中,您需要在绘制之前将指向数据的指针传递给OpenGL。当VBO出现时,他

c++ - if 语句中的函数名以一种奇怪的方式转换

使用此代码(有效的C++11):#include#includeboolmy_awesome_func(intparam){return(param>1);}intmain(intargc,charconst*argv[]){fprintf(stderr,"typeofmy_awesome_func:%s\n",typeid(my_awesome_func).name());if(my_awesome_func){fprintf(stderr,"WHAT???\n");}return0;}问题在if语句中。虽然typeid返回一些看起来像FbiE的东西(我认为这是函数类型的gcc语言)

c++ - "signed char"和 "unsigned char"能否始终相互转换而不丢失数据?

在C++中,我们可以使用signedchar和unsignedchar,它们的大小相同但值的范围不同。在下面的代码中:signedcharsignedChar=-10;unsignedcharunsignedChar=static_cast(signedChar);signedChar=static_cast(unsignedChar);无论其原始值是多少,signedchar都会保留其值吗? 最佳答案 不,没有这样的保证。从signedchar到unsignedchar的转换是明确定义的,就像C++(和C)中的所有有符号到无符号整

c++ - 为什么要经历 static_cast 的麻烦——将数字转换为 double ?

在我正在处理的代码中遇到了这个问题:doublepart2=static_cast(2)*somthing1*(static_cast(1)+something2)+(static_cast(1)/static_cast(2))*something3+(static_cast(1)/static_cast(2))*pow(something4,3);(something是doubles。)我怀疑有一个很好的理由来解决这个问题static_cast(1)之类的,但似乎我可以少打很多字。我不明白什么?提前致谢。 最佳答案 许多stati