在C++命名空间中,当在头中声明的非成员子例程前面加前缀时,“static”限定符是否有任何作用

In a C++ namespace does the `static` qualifier have any effect when prefixing non-member subroutines declared in the header?

本文关键字:static 是否 作用 任何 前面 命名空间 C++ 声明 子例程 成员 加前缀      更新时间:2023-10-16

考虑:

namespace JohnsLib {
    static bool foobar();
    bool bar();
}

static在这里有什么含义?

它将链接从"外部"更改为"静态",使其对链接器不可见,对其他编译单元不可用。(好吧,如果其他编译单元也包含头,它们会得到自己的单独副本)

static在命名空间范围内意味着它是翻译单元(即源文件)的本地。如果在头文件中定义函数,并将该头包含在多个C++文件中,则不会出现重新定义错误,因为所有函数都是唯一的(更正确地说,函数将具有内部链接)。同样的效果可以通过匿名名称空间来实现,例如

namespace JohnsLib
{
    namespace
    {  
         bool foobar() {definition here, won't cause redefinition errors}
    }
    bool bar();
}

static关键字在命名空间范围(全局或用户定义的命名空间)中的结果是这样的定义对象将不具有外部链接;也就是说,它将无法从其他翻译单元获得,并且不能用作(非类型的,即引用或指针)模板参数。

在C++编程语言Bjarne状态中在C和C++程序中,

关键字static(令人困惑)被用来表示"使用内部链接"。除了函数和类内部,不要使用静态

在Sutter/Andrescu C++编码标准中,第61项是"不要在头文件中定义具有链接的实体。"