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

时间:2019-04-07 20:09:26

标签: c++ multilingual complex-numbers c11 complextype

我最近注意到C99中存在types for complex values(在注意到它们的构造宏是C11的功能之后)。

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

注意:它们当然具有完全相同的行为,因为C ++具有C所没有的功能,但是请考虑一下,就好像我们将自己限制在“ C子集”之外,这两种类型一样。

如果它们实际上不是相同的-请说明它们之间的区别。

1 个答案:

答案 0 :(得分:3)

std::complex_Complex的不同之处主要在于界面。

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

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

C ++ 17 29.5.4状态:

  

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

     
      
  • 表达式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中引入的。