C++ 重新解释C+中的cast用法+;
这只是一个简单的问题:C++ 重新解释C+中的cast用法+;,c++,fftw,reinterpret-cast,C++,Fftw,Reinterpret Cast,这只是一个简单的问题: fftw_complex *H_cast; H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N); 以下两者之间的区别是什么: H_cast= reinterpret_cast<fftw_complex*> (H); H_cast=重新解释H_cast(H); 及 H_cast=重新解释H_cast(&H); 先谢谢你 安东尼奥对当前问题的回答 区别在于他们做了两件完全不同的事
fftw_complex *H_cast;
H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
以下两者之间的区别是什么:
H_cast= reinterpret_cast<fftw_complex*> (H);
H_cast=重新解释H_cast(H);
及
H_cast=重新解释H_cast(&H);
先谢谢你
安东尼奥对当前问题的回答 区别在于他们做了两件完全不同的事情 注意:您没有告诉我们什么是
H
,因此无法自信地回答问题。但一般原则适用
第一种情况是合理的代码,H
应该是指向fftw\u复合体
实例的指针(可能键入void*
)。您可以这样做,告诉编译器H
实际上是一个fftw\u复合体*
,这样您就可以使用它了
第二种情况是合理的代码,H
应该是内存布局与classfftw\u complex
相同的类的实例。我想不出一个令人信服的理由把自己置于这种情况下,这是非常不自然的。基于此,由于您没有向我们提供有关H
的信息,我认为这几乎肯定是一个bug
原始答案
主要区别在于,在第二种情况下,您可以在源代码中搜索reinterpret\u cast
(希望确保每个使用都有明确的文档记录,并且是必要的)
但是,如果您是从
void*
转换到另一个指针类型(这里是这样吗?),那么最好使用static\u cast
(也可以很容易地搜索到)。回答当前问题
区别在于他们做了两件完全不同的事情
注意:您没有告诉我们什么是H
,因此无法自信地回答问题。但一般原则适用
第一种情况是合理的代码,H
应该是指向fftw\u复合体
实例的指针(可能键入void*
)。您可以这样做,告诉编译器H
实际上是一个fftw\u复合体*
,这样您就可以使用它了
第二种情况是合理的代码,H
应该是内存布局与classfftw\u complex
相同的类的实例。我想不出一个令人信服的理由把自己置于这种情况下,这是非常不自然的。基于此,由于您没有向我们提供有关H
的信息,我认为这几乎肯定是一个bug
原始答案
主要区别在于,在第二种情况下,您可以在源代码中搜索reinterpret\u cast
(希望确保每个使用都有明确的文档记录,并且是必要的)
但是,如果您是从
void*
强制转换到另一个指针类型(这里是这样吗?),那么最好使用static\u cast
(也可以很容易地搜索到)。指针强制转换总是作为重新解释的强制转换执行,因此在从void*强制转换或向void*强制转换时,c样式强制转换之间没有区别,静态转换或重新解释转换
Reinterpret_类型转换通常保留在最丑陋的位置,其中c样式转换和静态_类型转换用于无害的类型转换。基本上,您可以使用reinterpret_cast将某些代码标记为非常丑陋:
float f = 3.1415f;
int x = *reinterpret_cast<int *>(&f);
float f=3.1415f;
int x=*重新解释铸件(&f);
这样,这些丑陋的不安全强制转换是可搜索的。指针强制转换始终作为重新解释强制转换执行,因此当从或向空*强制转换时,c样式强制转换、静态强制转换或重新解释强制转换之间没有区别
H_cast= reinterpret_cast<fftw_complex*> (H);
Reinterpret_类型转换通常保留在最丑陋的位置,其中c样式转换和静态_类型转换用于无害的类型转换。基本上,您可以使用reinterpret_cast将某些代码标记为非常丑陋:
float f = 3.1415f;
int x = *reinterpret_cast<int *>(&f);
float f=3.1415f;
int x=*重新解释铸件(&f);
这样,这些丑陋的不安全类型转换是可搜索/可浏览的。H\u cast=reinterpret\u cast(H);
H_cast= reinterpret_cast<fftw_complex*> (H);
这将转换H中的指针ish类型(或者整数本身,如果H是整数类型),并告诉编译器“这是一个指针。停止思考它是什么,它现在是一个指针”。H用作存储类似指针的地址的地方
H_cast= reinterpret_cast<fftw_complex*> (&H);
H_cast=重新解释H_cast(&H);
这将H的地址(它是指向任何类型H的指针)转换为指向“fftw_complex”的指针。修改H_cast的内容现在将更改H本身
如果H不是指针,则需要第二个,如果是指针,则通常需要第一个。另一种方法也有使用案例,但它们并不常见且丑陋(尤其是重新解释int或-上帝禁止-双精度作为指针)。H\u cast=reinterpret\u cast(H);
这将转换H中的指针ish类型(或者整数本身,如果H是整数类型),并告诉编译器“这是一个指针。停止思考它是什么,它现在是一个指针”。H用作存储类似指针的地址的地方
H_cast= reinterpret_cast<fftw_complex*> (&H);
H_cast=重新解释H_cast(&H);
这将H的地址(它是指向任何类型H的指针)转换为指向“fftw_complex”的指针。修改H_cast的内容现在将更改H本身
如果H不是指针,则需要第二个,如果是指针,则通常需要第一个。另一种方法也有一些用例,但它们并不常见且难看(尤其是将int或-上帝禁止-double重新解释为指针)。如果您想询问两个语句之间的差异,您可能想给我们两个不同的语句?抱歉,提示错误,现在是正确的!编辑以将第一个选项更改为OP可能想要的选项。两个选项中的一个有符号AND,另一个没有。你能解决这个问题吗?我的问题是关于是否有“与”的区别,因为它给了我一个错误