【发布时间】:2017-10-26 01:56:55
【问题描述】:
我有一些 C DSP 库,它们使用 complex [T] 类型来表示复数。我想从使用 std::complex<T> 的 C++ 应用程序中调用它们。
在阅读了this SO answer和this one,以及N4296的§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));
}
并尝试使用CXXFLAGS="-std=c++11" 编译它。我从 GCC 6.3.1 得到以下信息:
error: invalid cast from type ‘std::complex<float>’ to type ‘float [2]’
cfunc(reinterpret_cast<float[2]>(z));
这是一个编译器错误还是我误解了什么?给定使用std::complex<T> 类型的C++ 代码,如何使用带有complex [T] 参数的C 函数?目前,我使用一种肮脏的技巧来解决这个问题,但我更喜欢一种干净的方法。
我尝试使用 -std=c++14 进行编译,以防此功能以某种方式错过了 C++11(尽管帖子引用了 C++11 标准)但我得到了相同的结果。
26.4 复数 [complex.numbers]
标题
<complex>定义了一个类模板,以及用于表示和操作的许多函数 复数。为浮点、双精度或长双精度以外的任何类型实例化模板复合体的效果 未指定。专业化
complex<float>、complex<double>和complex<long double>是 文字类型 (3.9)。如果函数的结果未在数学上定义或不在其可表示值的范围内 类型,行为未定义。
如果 z 是 cv
std::complex<T>类型的左值表达式,则:4.1。表达式
reinterpret_cast<cv T(&)[2]>(z)应该是格式良好的,4.2。
reinterpret_cast<cv T(&)[2]>(z)[0]应指定 z 的实部,并且4.3。
reinterpret_cast<cv T(&)[2]>(z)[1]应指定 z 的虚部。
【问题讨论】:
-
阅读
<complex.h>头文件的注释:en.cppreference.com/w/cpp/header : " (已弃用)仅包含头文件" ... " (C++11 起)(C++17 中已弃用)" -
@RichardCritten:您介意粘贴相关部分的 sn-p,这样我们就不必全部追查了吗?
-
@RichardCritten:谢谢。就我而言,
complex.h包含在 C 标头而不是 C++ 代码中。我在实验中添加了它,因为它会包含在我的应用程序中(通过 C 库头文件)