我整天都在阅读有关未命名空间的文章,大多数文章解释了何时应该通过static关键字使用未命名空间。但是我仍然有一个大问题,什么时候使用static合适?毕竟它还没有完全被弃用,现在应该将带有静态功能的头文件放在未命名的 namespace 中吗?
#ifndef HEADER_H
#define HEADER_H
static int func() {
...
}
// versus:
namespace {
int func() {
...
}
};
#endif // HEADER_H
或静态成员函数呢?
你好
最佳答案
该标准的确切措辞为:
头文件中的函数应为inline
而不是static
或未命名的 namespace 。 inline
意味着您最多只能在程序中获得该函数的一个副本,而其他方法将为您提供与每个包含 header 的文件的单独副本。除了膨胀之外,如果函数包含函数静态数据,这可能会导致错误的行为。 (编辑:除非该函数在不同的编译单元中具有不同的定义,可能是由于在包含头文件之前定义了不同的预处理器宏。在那种情况下,最好的方法是根本不包含它,而是把它埋在一个没有标记的坟墓中,并通过它的邪恶之心刺入木桩。)
除了常量之外,数据对象通常根本不应该在头文件中定义,而只能声明为extern
。
静态成员函数是另一回事,您必须在那里使用static
,因为没有其他方法可以声明它们。该用法未弃用,因为它不在 namespace 范围内。
更新: C++ 11已删除了弃用项,因此,不再有任何特定的原因而不是static
来偏爱未命名的 namespace 。但是除非您做得很奇怪,否则您仍然不应该在头文件中使用任何一个。