【问题标题】:What is the scope of a class declaration in C++?C++ 中类声明的范围是什么?
【发布时间】:2019-08-01 04:59:42
【问题描述】:

类声明的范围是什么?特别是:如果我在源文件中声明一个类,它是在全局范围内还是在翻译单元范围内或其他范围内?另外...如何只在翻译单元的范围内声明一个类,如静态变量?

(例如:我可以在某个源文件中声明一个类,而不必担心在我的主源文件中意外访问它吗?)

【问题讨论】:

  • 请让您的问题独立,代码链接在这里不合适
  • 非语言律师回答:如果在 CPP / CXX 中,它仅在该 CPP / CXX 中可见。如果在 H 中,则仅对实现的 CPP 和包含 H 的任何内容可见。这是自 Borland 的 DOS 以来我使用的每个 C++ 编译器的答案。
  • @πάνταῥεῖ 这是指向 cppreference,com 的链接,为什么这样不好?我认为它增加了上下文。如果不好我会删除它。
  • 如果您担心名称冲突,您可以随时使用命名空间。
  • @user4581301 我的编译器说:'static' is not permitted on a declaration of a type。并非所有声明都是如此;例如,using 关键字仅在翻译单元(文件)的范围内可见,尽管这是一种特殊情况。 (顺便说一句,请告诉我问题中不清楚的地方)。

标签: c++ class scope declaration


【解决方案1】:

类的作用域是声明类的命名空间。如果在全局命名空间中声明,则该类是全局的。

必须在 ODR 使用该类的每个翻译单元中定义一个类。所有引用类名的 TU 始终引用同一个类,而不是特定于 TU 的类。类的定义在所有 TU 中必须相同。

如何只在翻译单元的范围内声明一个类

您可以使用未命名的命名空间:

namespace {
    struct this_TU_only {
        int member;
    };
}

在另一个 TU 中定义以下类不会有问题:

namespace {
    struct this_TU_only {
        float member;
    };
}

这是因为未命名的命名空间在每个翻译单元中是不同的。

【讨论】:

  • 完美答案,你对答案的第一部分有什么参考吗?为未命名的命名空间 +1!
  • 第一部分似乎不是真的。例如,编译g++ someclass.cc main.cc,其中main.cc 实例化someclass.cc 中定义的类的对象会导致编译器错误...was not declared in this scope。在main.cc 中定义类,然后尝试在someclass.cc 中使用它会产生相同的错误。同样尝试以相反的顺序链接它们会得到相同的结果。
  • 现在我再次阅读了您的答案,我想我一开始可能会误解它...您的意思是必须在每个 TU 中明确定义一个类还是您的意思是它总是被定义隐含在每个 TU 中?
  • @dekuShrub Do you mean that a class must explicitly be defined in every TU 是(ODR 使用该类的每个 TU)。
猜你喜欢
  • 2010-09-18
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2020-06-08
  • 2014-11-15
  • 2017-07-14
  • 2011-02-13
相关资源
最近更新 更多