【问题标题】:Unnamed struct declaration inside for loop initialization statementfor循环初始化语句中的未命名结构声明
【发布时间】:2013-05-18 16:19:16
【问题描述】:

在其中一个 SO 线程中,我看到了一个未命名的 struct 的用法,它在 for 循环中充当不同类型的多个变量的占位符:

例如:

for(struct {
      int i;
      double d;
      char c;
    } obj = { 1, 2.2, 'c' };
    obj.i < 10;
    ++obj.i)
{
  ...
}

这个compiles fine 带有 g++。
这是标准的 C++03 语法吗?

【问题讨论】:

  • 我很确定是这样的。
  • + 有趣,在 c99 中也可以
  • 并在循环中使用decltype(obj) 来拥有其他变量!

标签: c++ for-loop struct anonymous-class


【解决方案1】:

您可以在任何可以使用结构的地方使用未命名的结构 - 唯一的区别是它没有可以在其他地方使用的名称。您几乎可以在任何可以使用类型的地方声明新类型。在大多数地方这样做可能没有特别的意义,但那是另一回事。

我不会完全推荐这个,除非在非常特殊的情况下,但它是有效的。

【讨论】:

  • "你可以在任何可以使用类型的地方声明一个新类型"不在模板调用中;)
【解决方案2】:

以下代码将在 C++ (g++ 5.4.0) 中运行。

http://rextester.com/ELWLF59792

//g++  5.4.0

#include <iostream>

#include <stdio.h>

int main()
{
      int i = 0;

      for(struct st{ int a[9]; }t;i<3;i++)
            printf("%d\n", t.a);
}

下面的代码可以在 C (gcc 5.4.0) 中运行。

//gcc 5.4.0

#include <stdio.h>

int main()
{
      int i = 0;
      struct st{ int a[9]; }t;
      for(;i<3;i++)
            printf("%d\n", t.a);
}

【讨论】:

  • 这样的代码是什么意思?打印t.a?只循环到 3 点?
  • 在代码中很清楚,对于 i=0,1,2,它的计数器的值是 true。所以它打印了 3 次。
  • printf("%d\n", t.a); 将始终打印t.a 的地址(即&amp;t.a[0]) - 为什么循环?
  • 对不起@Ajay,我在这里错误地回答了另一个问题的答案。我会检查并更改我的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 2019-04-03
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多