C99 中的_Complex类型在 C++ 中的行为是否类似于 std::complex<>?

Do _Complex types in C99 behave like std::complex<> in C++?

本文关键字:std 类似于 complex lt gt 是否 类型 Complex 中的 C++ C99      更新时间:2023-10-16

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

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

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

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

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>_Complex T为 C 和 C++ 编写可互操作的代码。

注意:_Complex是在C99中引入的。