我最近注意到C99中存在types for complex values(在注意到它们的构造宏是C11的功能之后)。
由于这是C语言,所以它们是内置类型,而不是带有重载运算符的结构等。但是-是还是不是我可以将它们视为基于C ++的std::complex
模板?即float _Complex
实际上与std::complex<float>
相同,而double _Complex
与std::complex<double>
相同吗?
注意:它们当然具有完全相同的行为,因为C ++具有C所没有的功能,但是请考虑一下,就好像我们将自己限制在“ C子集”之外,这两种类型一样。
如果它们实际上不是相同的-请说明它们之间的区别。
答案 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中引入的。