什么时候适合在C ++中使用静态(通过未命名的名称空间)?
我一整天都在阅读有关未命名的命名空间的文章,大多数文章都解释了何时应该使用静态关键字的未命名命名空间。 但是,我仍然留下一个很大的问题,何时适合使用静态? 毕竟它还没有被完全弃用,那么现在我应该如何将它们放入未命名的命名空间中,并且使用静态函数的头文件呢?
#ifndef HEADER_H
#define HEADER_H
static int func() {
...
}
// versus:
namespace {
int func() {
...
}
};
#endif // HEADER_H
或者静态成员函数呢?
问候
该标准的准确措辞是:
在命名空间范围内声明对象时,不推荐使用static
关键字。
头文件中的函数应该是inline
而不是static
或者在未命名的名称空间中。 inline
意味着您最终只能在程序中获得最多一个函数副本,而其他方法将为每个包含标题的文件提供单独的副本。 除了膨胀,如果函数包含函数静态数据,这可能会导致错误的行为。 ( 编辑:除非函数应该在不同的编译单元中有不同的定义,这可能是由于在包含头文件之前定义了不同的预处理器宏。在这种情况下,最好的方法是根本不包括它,而是埋在它在一个没有标记的坟墓里,通过它邪恶的心脏而与它有着利害关系。)
除常量之外,数据对象通常不应该在头文件中定义,只能声明为extern
。
静态成员函数是鱼的不同水壶,你必须使用static
,因为没有其他的方法来声明他们那里。 该用法不被弃用,因为它不在命名空间范围内。
更新: C ++ 11已经取消了弃用,所以没有任何特别的理由可以选择static
命名空间。 但是你仍然不应该在头文件中使用,除非你做了一些奇怪的事情。
命名空间范围内的静态命名空间没有我知道的无名命名空间的优点。 使用未命名的名称空间,如上例所示。 实际上,在上面的例子中,我看不到为什么需要静态或未命名的名称空间。 也许内联? 静态成员函数与命名空间范围内的静态无关。 静态成员函数(和非函数成员)仍然有效。
在头文件中,指定内部链接或使用匿名名称空间通常没有意义。
在单独编译的实现文件中,您可以使用static
或匿名命名空间来避免链接级别名称冲突或依赖实现细节的客户端代码。 匿名命名空间允许您有外部链接,这是模板参数所必需的,并且它还支持类定义。 但最终,这只是一个实际问题和个人偏好问题,在个案基础上。
static
的成员函数与链接规范无关。 无论如何, static
成员函数都有外部连接。
上一篇: When is it appropriate to use static (over unnamed namespaces) in C++?