c++ - 为什么禁止在 extern 声明中限定名称?

标签 c++ namespaces extern

为什么由 extern 声明引入的名称只允许来自最内部的封闭命名空间?如果没有,它会带来什么复杂性?还是仅仅因为这部分标准是从 C 标准复制而来的,没有命名空间?

Please see the respective part of the standard

编辑:
一个可以方便使用的示例场景:使用 x在函数模板中 f在命名空间 ns , 其中 x在全局命名空间中的某处定义,并且不希望在所有翻译单元中引入(在函数定义之外)#include header f .

namespace ns
{
  template <typename> void f()
  {
    // extern int ::x; // ill-formed
    extern int x;      // refers to ns::x, which is not the case :(
    ++x;
  }
}

最佳答案

Why is it forbidden to qualify name in extern declaration?



因为没有意义。

假设您要使用 foo::bar而在命名空间 foo:::baz .有两种情况
  • 声明foo::bar是可见的。那么你不需要重新声明它。只需使用名称,如果需要则限定。
  • 声明foo::bar不可见。那么你不能首先在除 foo 之外的任何命名空间中声明它。 .

  • Why are names introduced by an extern declaration only allowed to come from the innermost enclosing namespace?



    他们不是。它们可能来自全局命名空间,这是 extern 的主要用例。 .另一个用例是前向声明一个稍后将在同一命名空间中定义的函数,我想这是甚至允许此类相同命名空间声明的唯一原因。 extern 没太大必要在这些用例之外。提前申报foo::bar从内部 foo::baz太困惑且容易出错。

    关于c++ - 为什么禁止在 extern 声明中限定名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58749393/

    相关文章:

    c - 外部变量名在 main 中不可见?

    c++ - 在类中构建结构

    java - 痛饮 : How to rename generated Java code according to a regex?

    带命名空间的 PHP 动态类加载

    c - 将变量放在标题中与将变量放在源中之间的区别

    c - 在 C 中链接外部变量

    c++ - 使用 MFC 时由于 "__cdecl"和 "__thiscall"调用约定不匹配导致的链接器错误?

    c++ - 如何在此OpenMP摘要示例中删除依赖项

    kubernetes - 创建多个 kubernetes 命名空间

    docker - 在 pod 处触发 kubectl exec 命令后,如何查找因退出代码 137 错误而终止的命令的日志