类声明的范围是什么?特别是:如果我在源文件中声明一个类,它是在全局范围内还是在翻译单元范围内或其他范围内?另外...如何仅在翻译单元的范围内声明类,例如静态变量?
(例如:我可以在某个源文件中声明一个类而不必担心意外地在主源文件中访问它吗?)
答案 0 :(得分:3)
类的范围是声明该类的名称空间。如果在全局名称空间中声明了该类,则该类是全局的。
必须在ODR使用该类的每个翻译单元中定义一个类。引用类名称的所有TU始终引用同一类,而不是TU特定的类。在所有TU中,类的定义必须相同。
如何仅在翻译单元的范围内声明类
您可以使用未命名的命名空间:
namespace {
struct this_TU_only {
int member;
};
}
在另一个TU中定义以下类别将不是问题:
namespace {
struct this_TU_only {
float member;
};
}
这是因为未命名的命名空间在每个翻译单元中都是不同的。