我整天都在阅读有关未命名空间的文章,大多数文章解释了何时应该通过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 。但是除非您做得很奇怪,否则您仍然不应该在头文件中使用任何一个。

09-05 06:53