所以,我知道静态函数是文件本地的函数。因此,不能从其他文件访问它们。这也适用于课程吗?我已经阅读了大量关于如何static class
不声明该类以包含纯静态成员和方法(这很明显)的争议,但找不到任何提及这是否会声明该类可在本地访问文件范围,因为更合乎逻辑。
如果没有,那么使用匿名命名空间怎么样,我听说它也可以用来声明文件本地函数?
所以,我知道静态函数是文件本地的函数。因此,不能从其他文件访问它们。这也适用于课程吗?我已经阅读了大量关于如何static class
不声明该类以包含纯静态成员和方法(这很明显)的争议,但找不到任何提及这是否会声明该类可在本地访问文件范围,因为更合乎逻辑。
如果没有,那么使用匿名命名空间怎么样,我听说它也可以用来声明文件本地函数?
您可以在未命名的命名空间中定义一个类,例如
namespace
{
struct A {};
}
在这种情况下,类名将具有内部链接。也就是说,它仅在定义它的编译单元中可见,并且包含该定义的所有编译单元都将具有自己的类定义。
至于存储类说明符static
(7.1.1 存储类说明符)
5 静态说明符只能应用于变量和函数的名称以及匿名联合
这也适用于课程吗?
不,类没有这样的“静态”关键字。
作为“匿名命名空间”的替代方案,您可以完全在单个 cpp 文件中声明一个类 (Foo) 及其定义(实现)。可以使用此类的唯一代码是该声明下方的代码...
文件 X.cpp:
// Foo declared
class Foo
{
public:
//...ctor
//...dtor
// etc.
}
// ... Foo defined (implemented)
Foo::etc() { ... }
// implementation of X - only X has access to Foo.
X.cpp 结束。
And File X.hpp does not reference Foo.
如果您随后发现名称冲突(即链接器报告重复符号),您唯一的选择是更改一个或另一个名称。
SO中有很多关于匿名命名空间的问答。我很小心我放入了什么样的东西,并同意它们可以防止名称冲突。
我已经使用了这两种技术。