C99 中的 _Complex 类型的行为与 C++ 中的 std::complex<> 类似吗?

ein*_*ica 2 c++ multilingual complex-numbers complextype c11

我最近注意到C99 中存在复数值类型(在注意到它们的构造宏是 C11 的一个功能之后)。

由于这是 C,所以这些是内置类型,而不是具有重载运算符等的结构。但是 - 我是否可以将它们视为基于 C++ 的模板std::complex?IE。实际上float _Complex与 相同并且std::complex<float>与double _Complex相同std::complex<double>?

注意:当然,它们具有完全相同的行为,因为 C++ 具有 C 没有的功能,但可以认为我们将自己限制在除这两种类型之外的“C 子集”。

如果它们实际上不相同 - 请解释它们有何不同。

小智 5

std::complex不同之处_Complex主要在于它的界面。

要获得真正的部分,std::complex请使用constexpr T real() const成员函数,类型相同_Complex需要creal宏。

所以它们不是同一类型,很难假装它们是同一类型,但它们确实具有相同的内部布局。

C++17 29.5.4 指出:

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

  • 表达式reinterpret_cast<cv T(&)[2]>(z)应格式良好,
  • reinterpret_cast<cv T(&)[2]>(z)[0]应指定 的实部z,并且
  • reinterpret_cast<cv T(&)[2]>(z)[1]应指定 的虚部z。

此外,如果a是 类型的表达式cv complex<T>*,并且该表达式a[i]对于整数表达式 是明确定义的i,则:

  • reinterpret_cast<cv T*>(a)[2*i]应指定 的实部a[i],并且
  • reinterpret_cast<cv T*>(a)[2*i + 1]应指定 的虚部a[i]。

C18 6.2.5.13 规定:

每个复杂类型与恰好包含相应实数类型的两个元素的数组类型具有相同的表示和对齐要求;第一个元素等于复数的实部,第二个元素等于复数的虚部。

这意味着您可以使用std::complex<T>C_Complex T和 C++ 编写可互操作的代码。

注:_Complex在C99中引入。