两者都是复杂的浮动"和"浮动复杂"有效的C?

时间:2017-01-16 14:52:37

标签: c

我的问题很简单:

  

两者都是#34;复杂浮动"和"浮动复杂"有效的C?

两者似乎都被gcc接受,没有任何警告。

2 个答案:

答案 0 :(得分:6)

complex是complex.h中的一个宏,它扩展为类型说明符_Complex。其行为与所有其他类型说明符相同,例如int, bool, double。对于属于同一" group"的所有类型说明符,您可以按各种顺序组合它们。这由C11 6.7.2规定,强调我的:

  

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

然后是一个有效的类型说明符组列表,我们在其中找到

  
      
  • float _Complex
  •   
  • double _Complex
  •   

意味着同一组中的说明符的任何排列都没问题。

再举一个例子,有一个小组

  
      
  • unsigned long longunsigned long long int
  •   

这为我们提供了以下可能的组合:

unsigned long long x;
long unsigned long y;
long long unsigned z;

unsigned long long int a;
unsigned long int long b;
unsigned int long long c;
int unsigned long long d;
long unsigned long int e;
long long unsigned int f;
long long int unsigned g;
long unsigned int long h;
...

这些都意味着同样的事情。

答案 1 :(得分:5)

是。一般来说,"类型词的顺序"在声明开头并不重要:

static const unsigned long int x = 42;

相同
long const int unsigned static x = 42;

参考:C99,6.7.2 / 2

  

[...]类型说明符可能以任何顺序出现   与其他声明说明符混合。

float_Complex都是类型说明符。)