C99 中的_Complex类型在 C++ 中的行为是否类似于 std::complex<>?
Do _Complex types in C99 behave like std::complex<> in C++?
我最近注意到 C99 中存在复杂值的类型(在注意到它们的构造宏是 C11 的一个功能之后)。
由于这是 C,因此这些是内置类型,而不是具有重载运算符等的结构。但是 - 我是否可以将它们视为基于 C++ 的std::complex
模板? 即float _Complex
实际上与std::complex<float>
相同,double _Complex
与std::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中引入的。
相关文章:
- 类似于strcat()的函数出现问题
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- C++类似于 std::map 的数据结构,具有多个键级别
- 就地合并,类似于 std::vector 中的元素
- 使结构的行为类似于 std::tuple
- C99 中的_Complex类型在 C++ 中的行为是否类似于 std::complex<>?
- 创建一个类似于 std::integral_constant 的容器
- 为什么 std::move 的行为类似于 std::copy
- 类似于类中的 std::map 或 std::vector 的构造函数
- 为什么我需要一个类似于复合文字的临时构造来初始化我的std::数组成员
- C++类似于 std::vector / boost::array 的文件内存映射容器
- 将字符串的向量连接到std::ostream(类似于boost::Join)
- 为什么std::字符串串联运算符的工作原理类似于右关联运算符
- 为什么 std::生成类似于 std::for_each 的返回状态?
- 类似于' std::set_intersection ',但产生相等的元素对
- 对于std::tr1::unordered_map,是否存在类似于std::map::lower_bound的等效std
- 是否有std::函数类型或类似于带有auto参数的lambda
- 如何实现类似于 std::vector 的自定义类
- 是std::unordered_set连续的(类似于std::vector)
- 传递一个成员函数,类似于c++中的std::函数(类似于c#)