12

所以,我知道静态函数是文件本地的函数。因此,不能从其他文件访问它们。这也适用于课程吗?我已经阅读了大量关于如何static class不声明该类以包含纯静态成员和方法(这很明显)的争议,但找不到任何提及这是否会声明该类可在本地访问文件范围,因为更合乎逻辑。

如果没有,那么使用匿名命名空间怎么样,我听说它也可以用来声明文件本地函数?

4

2 回答 2

27

您可以在未命名的命名空间中定义一个类,例如

namespace
{
    struct A {};
}

在这种情况下,类名将具有内部链接。也就是说,它仅在定义它的编译单元中可见,并且包含该定义的所有编译单元都将具有自己的类定义。

至于存储类说明符static(7.1.1 存储类说明符)

5 静态说明符只能应用于变量和函数的名称以及匿名联合

于 2016-11-22T23:42:15.180 回答
0

这也适用于课程吗?

不,类没有这样的“静态”关键字。


作为“匿名命名空间”的替代方案,您可以完全在单个 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中有很多关于匿名命名空间的问答。我很小心我放入了什么样的东西,并同意它们可以防止名称冲突。

我已经使用了这两种技术。

于 2016-11-23T00:03:47.860 回答