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

Mar*_*wan 1 c c++ c++11

我有一些使用complex [T]复数类型的 C DSP 库。我想从使用std::complex<T>.

\n\n

阅读完这个 SO 答案this以及N4296的 \xc2\xa726.4后,我尝试了一项实验:

\n\n
extern "C" {\n#include <complex.h>\n// Using _Complex or __complex__ since C\'s "complex" type doesn\'t exist in C++\nvoid cfunc(_Complex float x);\n}\n#include <complex>\n\nvoid test()\n{\n        std::complex<float> z;\n        cfunc(reinterpret_cast<float[2]>(z));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并尝试用 来编译它CXXFLAGS="-std=c++11"。我从 GCC 6.3.1 得到以下信息:

\n\n
error: invalid cast from type \xe2\x80\x98std::complex<float>\xe2\x80\x99 to type \xe2\x80\x98float [2]\xe2\x80\x99\n  cfunc(reinterpret_cast<float[2]>(z));\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是编译器错误还是我误解了什么?complex [T]给定使用类型的 C++代码,如何使用带有参数的 C 函数std::complex<T>?目前,我使用一种肮脏的黑客方法来解决这个问题,但我更喜欢一种干净的方法。

\n\n

我尝试进行编译,-std=c++14以防万一此功能在某种程度上错过了 C++11(尽管帖子从 C++11 标准中引用了它),但我得到了相同的结果。

\n\n
\n\n
\n

26.4 复数[complex.numbers]

\n\n
    \n
  1. 标头<complex>定义了一个类模板,以及许多用于表示和操作复数的函数。

  2. \n
  3. 未指定除 float、double 或 long double\n 之外的任何类型实例化模板复合体的效果。特化complex<float>complex<double>complex<long double>是文字类型 (3.9)。

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

  6. \n
  7. 如果 z 是 cv 类型的左值表达式std::complex<T>,则:

    \n\n

    4.1. 表达式reinterpret_cast<cv T(&)[2]>(z)应格式良好,

    \n\n

    4.2. reinterpret_cast<cv T(&)[2]>(z)[0]应指定 z 的实部,并且

    \n\n

    4.3. reinterpret_cast<cv T(&)[2]>(z)[1]应指定 z 的虚部。

  8. \n
\n
\n

Nat*_*ica 5

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

reinterpret_cast<cv T(&)[2]>(z)
Run Code Online (Sandbox Code Playgroud)

形状良好。不表明是那样

reinterpret_cast<cv T[2]>(z)
Run Code Online (Sandbox Code Playgroud)

已验证。为了使代码编译,您需要将强制转换更改为强制转换为引用,该引用为您提供

cfunc(reinterpret_cast<float(&)[2]>(z));
Run Code Online (Sandbox Code Playgroud)

Live Example