【问题标题】:What does a typedef with three arguments mean?带有三个参数的 typedef 是什么意思?
【发布时间】:2020-04-28 00:10:46
【问题描述】:

我正在尝试编译包含以下头文件的代码:

#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

我的编译器被typedef double complex complex_t; 绊倒了

这对我来说很有意义,因为大多数 typedef 只包含两个参数:类型和别名。

这个发布的代码来自reputable source,所以我认为我做错了什么。但是,我对为什么 typedef 会使用 3 个参数感到困惑。

【问题讨论】:

  • typedef unsigned long long int ull; — 五个参数? (可疑的命名法——它们并不是真正的论点——但这是一个单独的话题。)
  • 您的问题是您在大概是 C++ 编译中包含了 C 标头 &lt;complex.h&gt;。 C++ 有自己的头文件&lt;complex&gt;,它定义了您应该在 C++ 中使用的复杂类型。您不应该尝试使用 C 类型。
  • @JonathanLeffler:最后我检查了一下,这在技术上是无效的 C++,尽管每个编译器都支持它
  • @JonathanLeffler 我同意你的看法。但是, 似乎没有包含正确的 typedef 定义。
  • @MooingDuck 任何有效的变量或函数声明(没有初始化程序)都可以在其前面加上typedef。规范没有说明您声称的内容。声明语法的规范在decl-specifiers中包含typedef(可以是任意数量),typedefs没有特殊语法

标签: c++ macros g++ c-preprocessor


【解决方案1】:

是的,大多数 typedef 都包含别名和基础类型,但没有要求类型是单个标记:

typedef unsigned long long int ULLI;
//      \____________________/
//  Many tokens for underlying type

因此,无论您的代码在何种情况下工作,似乎都已经具有 double complex 类型。

这种类型实际上是 C 标准的一部分,保存在 &lt;complex.h&gt; 中,但等效的 C++ &lt;ccomplex&gt;/&lt;complex.h&gt; 标头现在已替换为 &lt;complex&gt;,更适合 C++,因此它会包含它并使用complex&lt;double&gt; 类型更合适。

我相信,从 C++17 开始,&lt;ccomplex&gt;/&lt;complex.h&gt; 不再持有任何遗留的 C 内容,而是开始包含来自 C++ 标准库的其他非遗留头文件。

然后,在 C++20 中,他们完全放弃了它。来自(略微转述)C++20 [diff.cpp17.library],其中详细说明了差异:

更改:删除空洞的 C++ 头文件。

基本原理:空标头意味着实现 C 与 C++ 标头的兼容性的错误要求。

对原始功能的影响:执行 #include&lt;ccomplex&gt;(以及其他)的有效 C++ 2017 程序可能无法编译。为了保持相同的行为,&lt;ccomplex&gt; 中的 #include 可以替换为 &lt;complex&gt; 中的 #include

【讨论】:

  • 所以你是说在“typedef double complex complex_t”之前的某个地方应该存在一个“typedef double complex”?查看我的代码,我可以认为它在 中。如果找不到,编译应该会失败吗?
  • @HTNW:我更多的是考虑 C/C++ 的区别,但你说得对,我选择的术语很混乱。会修复的。
【解决方案2】:

complex 不是 C++ 中的关键字,double complex 不是类型。您正在将 C++ 与另一种语言混为一谈。

相反,您可以使用std::complex&lt;double&gt;,带或不带typedef。

【讨论】:

    【解决方案3】:

    这很 hacky,但将 更改为“/usr/include/complex.h”,这将强制作者打算包含。然后它应该建立。至少它适用于 Fedora 33 和 g++ 版本:

    > g++ --version 
    g++ (GCC) 10.2.1 20201125 (Red Hat 10.2.1-9) Copyright (C) 2020 Free Software 
    Foundation, Inc. This is free software; see the source for copying conditions.  
    There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
    PURPOSE.
    

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 2014-01-24
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2023-03-10
      相关资源
      最近更新 更多