C:在<complex.h>

时间:2016-06-05 06:42:52

标签: c gcc complextype

我有一个使用复数的代码。

当我声明变量“x”,这是一个大小为double的复数时,我应该将其声明为:

complex double x;

double complex x;


它有什么不同吗?有没有人有编译器的经验 不理解他们中的任何一个?

2 个答案:

答案 0 :(得分:4)

C标准在6.7.2类型说明符中说明

  

每个类型说明符列表应为以下集合之一[...]类型说明符可以按任何顺序出现

     
      
  • ...
  •   
  • float _Complex
  •   
  • double _Complex
  •   
  • long double _Complex
  •   

虽然标准在double,float和long double之后始终放置_Complex(因此complex),但它允许任何顺序

#include <complex.h>

int main(void)
{
    long double complex d1;
    double long complex d2;
    complex long double d3;
    complex double long d4;
    double complex long d5;
    long complex double d6;
}

演示:http://coliru.stacked-crooked.com/a/5cbc966b0c1b096e

答案 1 :(得分:2)

这在C Standard(N1570草案)第6.7.2节中指定。

类型说明符是多个关键字和其他结构中的任何一种,包括 float long double _Complex 。第2段说(重点补充)

  

声明中至少应给出一个类型说明符   每个声明中的说明符,以及说明符限定符列表中的说明符   每个结构声明和类型名称。每个类型说明符列表   应该是以下多个集合之一(逗号分隔,何时   每个项目有多个multiset); 类型说明符可以   以任何顺序发生,可能与其他声明混合   说明符。

在第5段中:

  

除了[无关的例外省略]之外,每个以逗号分隔的多个集合都指定相同的类型。

列出的多重集包括:

  • float _Complex
  • double _Complex
  • long double _Complex

这意味着,例如,long double _Complex_Complex double long同样有效,并具有相同的含义。

(该标准使用稍微模糊的术语“multiset”,因为类型说明符出现的次数可能有意义。如果不是long long,它将使用“set”一词。)

<complex.h>标准标头定义宏complex,扩展为关键字_Complex

我知道没有支持_Complex的C编译器,但不允许类型说明符按任何顺序排列。如果找到,请提交错误报告。

话虽如此,任意重新排序类型说明符都没有意义。 double complex是最惯用的形式(当然需要#include <complex.h>)。虽然语法不以这种方式对待它们,但您可以将double视为形容词,将complex视为名词; double complex复杂类型,而不是 double 类型。