_Complex和std::Complex之间的C/C++互操作

_Complex和std::Complex之间的C/C++互操作,c++,c,c++11,C++,C,C++11,我有一些C DSP库,它们使用复数[T]类型。我想从C++应用程序调用这些,这些应用程序使用了STD:: 在阅读了和的§26.4之后,我尝试了一个实验: extern "C" { #include <complex.h> // Using _Complex or __complex__ since C's "complex" type doesn't exist in C++ void cfunc(_Complex float x); } #include <complex&g

我有一些C DSP库,它们使用复数[T]类型。我想从C++应用程序调用这些,这些应用程序使用了STD:: 在阅读了和的§26.4之后,我尝试了一个实验:

extern "C" {
#include <complex.h>
// Using _Complex or __complex__ since C's "complex" type doesn't exist in C++
void cfunc(_Complex float x);
}
#include <complex>

void test()
{
        std::complex<float> z;
        cfunc(reinterpret_cast<float[2]>(z));
}
这是一个编译器错误还是我误解了什么?如何使用复杂的[t]参数的C函数,给出了使用STD::复杂类型的C++代码?目前,我使用肮脏的黑客来解决这个问题,但我更喜欢干净的方式

我试着用-std=c++14编译,以防这个特性在某种程度上错过了c++11,尽管帖子引用了c++11标准,但我得到了相同的结果

26.4复数[复数]

标头定义了一个类模板,以及许多用于表示和操作的函数 复数

为除float、double或longdouble以外的任何类型实例化模板复合体的效果 没有具体说明。专门化complex、complex和complex是 文字类型3.9

如果函数的结果未在数学上定义或不在其可表示值的范围内 类型,则行为未定义

如果z是cv std::complex类型的左值表达式,则:

4.1。“reinterpret_castz”一词应格式正确

4.2。reinterpret_castz[0]应指定z的实部,以及

4.3。重新解释_castz[1]应指定z的虚部


您的问题是您试图转换为一个值,而不是一个引用。标准保证:

reinterpret_cast<cv T(&)[2]>(z)
格式良好。它没有说

reinterpret_cast<cv T[2]>(z)
这是有效的。为了使代码能够编译,您需要将cast-To-cast更改为一个引用,该引用将为您提供

cfunc(reinterpret_cast<float(&)[2]>(z));

您的问题是您试图转换为一个值,而不是一个引用。标准保证:

reinterpret_cast<cv T(&)[2]>(z)
格式良好。它没有说

reinterpret_cast<cv T[2]>(z)
这是有效的。为了使代码能够编译,您需要将cast-To-cast更改为一个引用,该引用将为您提供

cfunc(reinterpret_cast<float(&)[2]>(z));

阅读头文件上的注释::不推荐仅包括头文件。。。由于C++11在C++17中已被弃用@RichardCriten:您介意粘贴一段相关章节的片段吗,这样我们就不必一一追查了?@RichardCriten:谢谢。在我的例子中,复C是由C头而不是C++代码所包含的。我在实验中添加了它,因为它将被我的应用程序通过C库头包含阅读头文件上的注释::deprecated只是包含头文件。。。由于C++11在C++17中已被弃用@RichardCriten:您介意粘贴一段相关章节的片段吗,这样我们就不必一一追查了?@RichardCriten:谢谢。在我的例子中,复C是由C头而不是C++代码所包含的。我在实验中添加了它,因为它将通过C库标题包含在我的应用程序中。我误解了圆括号的意思cfunc*重新解释_castz;`编译注意强制转换后的取消引用,如果C库需要一个复杂的by值,如我的测试用例中所示。您的回答也解释了为什么在标准中提到z是左值。@MarkKCowan Yep。这要求它是一个lvaule,以便您可以绑定到引用。我如何将std::complex*传递给采用复数T*的C函数?@MarkKCowan应该能够使用:如果函数采用float*[2]参数,则该方法有效,但对于采用指针指向复数的C函数,它似乎不起作用:啊,我误解了圆括号的意思cfunc*重新解释_castz;`编译注意强制转换后的取消引用,如果C库需要一个复杂的by值,如我的测试用例中所示。您的回答也解释了为什么在标准中提到z是左值。@MarkKCowan Yep。这要求它是一个lvaule,这样您就可以绑定到引用。我如何将std::complex*传递给采用复数T*的C函数?@MarkKCowan应该能够使用:如果函数采用float*[2]参数,这是可行的,但对于采用指针指向复数的C函数,它似乎不起作用: