在C++命名空间中,当在头中声明的非成员子例程前面加前缀时,“static”限定符是否有任何作用
In a C++ namespace does the `static` qualifier have any effect when prefixing non-member subroutines declared in the header?
考虑:
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项是"不要在头文件中定义具有链接的实体。"
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 这些示例中的 "static" 关键字是否有所作为?
- gcc 是否支持 -static-libgcc 和 -fexceptions?
- 涡轮增压 这个声明“int fun-name(static int)”在C++中是否有效,为什么
- 是否可以将"non-static blocks"代码放在类定义中?
- static关键字是否影响作用域
- C++如何判断static.lib是否有效,是否可从外部代码调用
- 在C++中,"static initialization fiasco"是否仅影响对另一个模块中定义的对象的数据成员的引用?
- static 关键字是否在 C/C++ 和存储级别中起作用?
- 在C++命名空间中,当在头中声明的非成员子例程前面加前缀时,“static”限定符是否有任何作用
- const/static关键字是否在变量声明中传播
- c++是否可以延迟常量static成员的初始化?
- C++中是否有"static class",例如要在同一文件中访问的静态函数?