在 C++名称空间 当为标头中声明的非成员子例程添加前缀时,“static”限定符是否有任何作用?
考虑一下:
namespace JohnsLib {
static bool foobar();
bool bar();
}
static
这里有什么含义?
Consider:
namespace JohnsLib {
static bool foobar();
bool bar();
}
What implications does static
have here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
它将链接从“外部”更改为“静态”,使其对链接器不可见,并且无法从其他编译单元使用。 (好吧,如果其他编译单元也包含标头,它们将获得自己的单独副本)
It changes the linkage from "external" to "static", making it invisible to the linker, and unusable from other compilation units. (Well, if other compilation units also include the header, they get their own separate copy)
命名空间范围内的
static
意味着它对于翻译单元(即源文件)而言是本地的。如果您在头文件中定义函数并将该头文件包含到多个 C++ 文件中,则不会出现重新定义错误,因为所有函数都是唯一的(更准确地说,这些函数将具有内部链接)。例如,可以通过匿名名称空间来实现相同的效果static
at namespace scope means that it is local to a translation unit (i.e. source file). If you define the function in the header file and include this header into multiple C++ files, you won't get redefinition errors because all the functions will be unique(more correctly, the functions will have internal linkage). The same effect can be achieved by means of anonymous namespaces, for example命名空间范围(全局或用户定义的命名空间)中的
static
关键字的结果是这样的定义对象不会有外部链接;也就是说,它不能从其他翻译单元获得,也不能用作(非类型,即引用或指针)模板参数。The result of
static
keyword in namespace scope (global or user defined namespace) is that such define object will not have external linkage; that is, it will not be available from other translation units and cannot be used as a (non-type one i.e. reference or pointer) template parameter.在 C++ 编程语言中,Bjarne 指出在 C 和 C++ 程序中,
在 Sutter/Alexandrescu C++ 编码标准第 61 项中,“不要在头文件中定义具有链接的实体。”
In the C++ programming Language Bjarne states In C and C++ programs,
In Sutter/Alexandrescu C++ Coding Standards Item 61 is "Don't define entities with linkage in a header file."