在 for 循环中声明匿名结构,clang 无法编译

2024-01-04

在 for 循环中声明匿名结构的代码在 gcc 中使用 -std=c99/gnu99 工作得很好

for (struct {int foo; int bar;} i = {0}; i.foo < 10; i.foo++);

但是,当我切换到 clang 时,我收到了错误:

error: declaration of non-local variable in 'for' loop

为什么这是一个错误?为什么它允许某些类型(例如“int”)但不允许其他类型(例如struct {int foo;})?这看起来不一致。 clang 是否无法正确实现 c99,或者该代码是否无效 c99 而 gcc 恰好支持它?

有谁知道在 clang 支持的 for 循环中声明多种类型变量的方法吗? (这对于宏很有用。)

EDIT:

既然人们问为什么这有用,我将粘贴一些示例代码:

#define TREE_EACH(head, node, field, iterator) for ( \
    /* initialize */ \
    struct { \
        node* cur; \
        node* stack[((head)->th_root == 0? 0: (head)->th_root->field.avl_height) + 1]; \
        uint32_t stack_size; \
    } iterator = {.cur = (head)->th_root, .stack_size = 0}; \
    /* while */ \
    iterator.cur != 0; \
    /* iterate */ \
    (iterator.stack_size += (iterator.cur->field.avl_right != 0) \
        ? (iterator.stack[iterator.stack_size] = avl_right, 1) \
        : 0), \
    (iterator.cur = (iterator.cur->field.avl_left == 0) \
        ? iterator.cur->field.avl_left \
        : (iterator.stack_size > 0? (iterator.stack_size--, iterator.stack[iterator.stack_size]): 0)) \
)

这是我编写的一个非常方便的宏,它在堆栈上以深度优先的顺序迭代 AVL 树。由于不允许在 for 循环中声明匿名结构,因此我必须使宏使用起来不太直观。我不可能将声明外包给树的其余部分,因为它使用可变长度数组。


我对之前的答案表示不服气。它使用 gcc 成功构建(使用-Wall -pedantic),但不适用于 clang 或 Visual Studio。

微软已经承认 Visual Studio 存在一个极其相似的问题Microsoft Connect 错误项目 http://connect.microsoft.com/VisualStudio/feedback/details/624410/visual-c-compiler-fails-to-parse-a-for-init-statement-that-starts-with-a-class-specifier.

6.8.5 是说在for-init-表达式不可能是typedef, extern or static(除了auto and register).

存储类别说明符auto在 C99 中是默认的并且是隐式的。结构体类型和标识符i然后是 auto (在该代码块内具有范围)。那么代码肯定有效吗?我不明白 6.8.5 如何禁止类型声明。

我认为gcc是正确的,这是clang和Visual Studio实现的一个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 for 循环中声明匿名结构,clang 无法编译 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • Android Studio 将目录标记为测试源根

    我在 build gradle 中做了一些操作来删除 androidTest java 包的绿色突出显示 我不知道如何把它找回来 IntelliJ 在上下文菜单中有一个 将目录标记为测试源根目录 选项 但我在 Android Studio
  • 使用 Python 3 将 Pig Latin 翻译成英语

    正如您将在下面的代码中看到的 我已经制作了一个将英语翻译成 Pig Latin 的程序 它遵循两个规则 如果单词以元音开头 则应附加 way 例如 apple 变为 appleway 如果单词以辅音序列开头 则该序列应移至末尾 以 a 为前
  • 重复上下动画 div

    我想要一个使用 jquery 重复上下移动的 div 换句话说 div 从某个位置的顶部开始 向下移动 然后向上移动并重复此过程 从上到下大约有 1 秒的时间间隔 再回到顶部大约有 1 秒的时间间隔 有slideUp和slideDown以及
  • 发送以 HTML 文件作为正文的电子邮件 (C#)

    如何使用 HTML 文件设置 MailMessage 的正文 只需设置邮件消息正文格式 http msdn microsoft com en us library system web mail mailmessage bodyformat
  • Scala 的“With”语句等效吗?

    也许是 Scala 学习者的闲思 但是 在我的修改中 我写了以下内容 n child size gt 0 n child filter isInstanceOf Text size 0 n 是 scala xml Node 但这并不重要 特
  • 对二维点数组进行排序以找出四个角

    您好 我有任何大小的二维点的集合 通过查找原点之间距离的最小值和最大值 我能够找出左上角和右下角点 但我无法找出顶部 右点和左下点 也许你可以使用cv approxPoly 找到二维点集的角点 然后您可以通过以下方式按您想要的任何顺序对点进
  • hibernate用于动态表创建

    我是一个 HIBERNATE 初学者 因为我需要创建其中包含动态字段的动态表 所以我选择使用 hibernate 据我了解 创建表需要一个类 其中包含类中定义的字段 如何根据具有所需字段的表动态生成类 我不确定我是否理解这个问题 标题是关于
  • Android使用EGL初始化openGL2.0上下文

    我想在Android上用本机代码进行离屏图像处理 所以我需要通过EGL在本机代码中创建openGL上下文 通过EGL 我们可以创建EGLSurface 我可以看到那里有三个选择 EGL WINDOW BIT EGL PIXMAP BIT E
  • 如何在 Visual Studio 2005/2008 中编译 Flex?

    我无法弄清楚这一点 我可以从 gnuwin32 下载 flex 2 5 4a 的 win32 二进制文件 但我想使用 Visual Studio 2005 构建最新版本 2 5 35 我想我可以在 cygwin 中构建 但其中的乐趣在哪里
  • Django 日志记录旋转文件不起作用

    所以我在 Django 日志记录到达时遇到了一些问题maxBytes尺寸 基本上 当发生这种情况时 文件似乎不会旋转并创建新文件 有人告诉我这可能与服务器的写入权限有关 但我不确定如何正确设置 以便 django 在旧日志文件已满时能够创建
  • 如何更改移动布局上的 Bootstrap 3 列顺序?

    我正在制作一个带有顶部固定导航栏的响应式布局 下面有两列 一列用于侧边栏 3 一列用于内容 9 在桌面上看起来像这样 navbar 3 9 When I resize移动navbar被压缩并隐藏 然后侧边栏堆叠在内容之上 如下所示 navb
  • 在Android中将位图的大小减小到某个指定的像素

    我想将 我的位图 图像尺寸减小到最大 640 像素 例如 我有尺寸为 1200 x 1200 px 的位图图像 如何将其减小到 640px 如果你传递位图width and height然后使用 public Bitmap getResiz
  • 通过 git URL 从 lerna 管理的 monorepo 安装包

    我在我的项目中使用纱线 我的项目有一个依赖项 它恰好是 lerna 维护的较大 monorepo 的子包 子包已更新但尚未发布 我需要未发布的代码 有没有办法通过git url安装lerna的子包 Thanks 如果您的问题是 如何通过 g
  • 如何实现记住我功能? [复制]

    这个问题在这里已经有答案了 可能的重复 为网站实施 记住我 的最佳方式是什么 https stackoverflow com questions 244882 what is the best way to implement rememb
  • HttpResponseMessage 内容不会显示 PDF

    我创建了一个 Web Api 它返回一个 HttpResponseMessage 其中内容设置为 PDF 文件 如果我直接调用 Web Api 它会很好地工作 并且 PDF 会在浏览器中呈现 response Content new Str
  • Spark - 使用不同的数据类型以编程方式创建模式

    我有一个由 7 8 个字段组成的数据集 这些字段的类型为 String Int 和 Float 我尝试使用以下方法通过编程方法创建架构 val schema StructType header split map column gt Str
  • Zend框架2访问模型类中的全局配置

    我有一个模型类 它不扩展任何核心 Zend 模块 该模型是从我之前的 Zend Framework 1 应用程序导入的 我可以通过将其转换为命名空间来调用它的方法 我遇到的问题是在定义的方法中读取全局配置 对于控制器 我可以使用以下代码访问
  • R 中的 readHTMLTable 仅从篮球参考页面返回前两个表

    我正在尝试从篮球参考网站抓取球队统计网页 但当我使用 readHTML 时 它只会带回前两个表格 我的 R 代码如下所示 url http www basketball reference com leagues NBA 2015 html
  • 使用 GCD 同步 Swift 3 中的属性

    我看了今年的WWDCGCD最近谈话 我认为有一个代码片段有问题 这是关于使用以下方法使属性成为线程安全的调度队列 class MyObject private var internalState Int private let intern
  • 在 for 循环中声明匿名结构,clang 无法编译

    在 for 循环中声明匿名结构的代码在 gcc 中使用 std c99 gnu99 工作得很好 for struct int foo int bar i 0 i foo lt 10 i foo 但是 当我切换到 clang 时 我收到了错误