Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新解释C+中的cast用法+;_C++_Fftw_Reinterpret Cast - Fatal编程技术网

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
应该是内存布局与class
fftw\u complex
相同的类的实例。我想不出一个令人信服的理由把自己置于这种情况下,这是非常不自然的。基于此,由于您没有向我们提供有关
H
的信息,我认为这几乎肯定是一个bug

原始答案

主要区别在于,在第二种情况下,您可以在源代码中搜索
reinterpret\u cast
(希望确保每个使用都有明确的文档记录,并且是必要的)


但是,如果您是从
void*
转换到另一个指针类型(这里是这样吗?),那么最好使用
static\u cast
(也可以很容易地搜索到)。

回答当前问题

区别在于他们做了两件完全不同的事情

注意:您没有告诉我们什么是
H
,因此无法自信地回答问题。但一般原则适用

第一种情况是合理的代码,
H
应该是指向
fftw\u复合体
实例的指针(可能键入
void*
)。您可以这样做,告诉编译器
H
实际上是一个
fftw\u复合体*
,这样您就可以使用它了

第二种情况是合理的代码,
H
应该是内存布局与class
fftw\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,另一个没有。你能解决这个问题吗?我的问题是关于是否有“与”的区别,因为它给了我一个错误