带有三个参数的 typedef 是什么意思?

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 个参数。

pax*_*blo 8

是的,大多数 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>

  • 所以你是说在“typedef 双复数complex_t”之前应该存在一个“typedef 双复数”?看看我的代码,我可能认为它会在 &lt;cmath&gt; 或 &lt;complex.h&gt; 中。如果找不到这些,编译应该会失败? (2认同)