Izz*_*zzo 6 c++ macros g++ c-preprocessor
我正在尝试编译包含以下头文件的代码:
#ifndef FFT_H
#define FFT_H
#include<cmath>
#include<complex.h>
#include<vector>
#define Vec(a, b) std::vector<__typeof(*(a))> ((a), (a)+(b))
typedef double complex complex_t; // this is my trouble line!
typedef double real_t;
#endif
Run Code Online (Sandbox Code Playgroud)
我的编译器被绊倒了 typedef double complex complex_t;
这对我来说很有意义,因为大多数 typedef 只包含两个参数:类型和别名。
此发布的代码来自信誉良好的来源,因此我认为我做错了什么。但是,我很困惑为什么 typedef 会使用 3 个参数。
是的,大多数 typedef 包含别名和底层类型,但不要求类型是单个标记:
typedef unsigned long long int ULLI;
// \____________________/
// Many tokens for underlying type
Run Code Online (Sandbox Code Playgroud)
所以无论你的代码在什么情况下工作,似乎都已经有一个double complex类型。
这种类型实际上是 C 标准的一部分,保留在其中,<complex.h>但等效的 C++<ccomplex>/<complex.h>标头现在已替换为<complex>,更适合 C++,因此包含它并使用该complex<double>类型会更合适。
我相信,从 C++17 开始,<ccomplex>/<complex.h>不再保留任何遗留的 C 内容,而只是开始包含来自 C++ 标准库的其他非遗留头文件。
然后,在 C++20 中,他们完全抛弃了它。来自(稍微解释一下)C++20 [diff.cpp17.library],其中详细说明了差异:
更改:删除空的 C++ 头文件。
基本原理:空标头暗示了实现与 C++ 标头的 C 兼容性的错误要求。
对原始功能的影响:执行 a
#includeof<ccomplex>(其中)的有效 C++ 2017 程序可能无法编译。为了保持相同的行为,a#includeof<ccomplex>可以替换为 a#includeof<complex>。
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |