当前位置: 首页 > 知识库问答 >
问题:

未命名命名空间中的非静态未命名联合

庄宇
2023-03-14

gcc和msvc无法编译这段代码,错误消息< code >命名空间范围的匿名聚合必须是静态的。但是clang编译这个没有问题。https://godbolt.org/z/WecT6vP91

namespace {
    union {
        int a;
        long b;
    };
}

https://en.cppreference.com/w/cpp/language/union说

命名空间范围匿名联合必须声明为静态,除非它们出现在未命名的命名空间中。

这似乎是gcc和msvc的错误?

已编辑:

但是,Clang 拒绝在嵌套在未命名命名空间中的命名命名空间中编译非静态匿名联合。是否可以将规则更改为“...除非它们出现在直接或间接的未命名命名空间中“(这似乎有另一个问题,见下文)或”...除非他们有内部联系“?或者为什么不能?

namespace {
  namespace ns {
    union {
      int a;
      long b;
    };
  }
}

根据未命名命名空间内名称的外部链接,未命名命名空间中的名称可以具有C语言链接。Clang甚至接受具有C语言链接的非静态匿名联合,但实际上没有生成链接符号,这似乎没有意义。标准是否允许?如果允许,则外部“C”在直接或间接的 umnamed 命名空间中会产生什么影响?

namespace {
  extern "C" union {
    int a;
    long b;
  };
}

共有1个答案

严昊昊
2023-03-14

海湾合作委员会和MSVC还没有完成P1787R6的实施;以前,该规则实际上说无论如何都需要静态,并且Cppreference是错误的(!)。

 类似资料:
  • 为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?

  • 内联命名空间旨在通过”版本”的概念,来实现库的演化。考虑如下代码: // 文件:V99.h inline namespace V99 { void f(int); // 对V98版本进行改进 void f(double); // 新特性 // … } // 文件:V98.h namespace V98 { void

  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码

  • Let the word of Christ dwell in you richly in all wisdom; teaching and admonishing one another in psalms and hymns and spiritual songs, singing with grrace in your hearts tto the Lord. And whatsoever

  • 客户端有许多“命名空间”,通常是一些公开的可管理功能。命名空间对应 Elasticsearch 中各种可管理的 endpoint。下面是全部的命名空间: **命名空间** **功能** `indices()` 索引数据统计和显示索引信息 `nodes()` 节点数据统计和显示节点信息 `cluster()` 集群数据统计和显示集群信息 `snapshot()` 对集群和索引进行拍摄快照或恢复数据

  • 命名空间 由于 js 环境极少命名空间管理模块, namespace 相对陌生, 比如有这样的文件结构, src/ demo/ core.cljs 可以看到 core.cljs 的路径就是: src/demo/core.cljs 注意 JVM 环境有个 classpath 的环境变量, 用于判断怎样查找源码, classpath 对应多个路径, 也可能是 jar 包, 而 jar 包中