C++ 变量 header 作用域

C++ variable header scope

我在 header[=28 中定义了一些 templaticinline 函数=] 文件(我们称之为 head.h)。目前,这些函数使用一些在同一个 header 中用 extern 声明并在一个 .cpp.

中定义的全局变量

一切正常,但我会将全局变量范围限制在定义它们的 header 范围内。

换句话说,每隔 .h.cpp 包括我的 head.h 将无法看到这样的全局变量。

有什么方法可以达到这个结果吗?

不,这是不可能的。 如果您在 header1.h 中将某个变量声明为 extern - 此变量将在任何其他 headers 中可用,其中包括 header1.h.

包含头文件只是将头文件的内容复制到包含cpp/h文件中。这意味着,您无法真正区分您是在头文件中还是在包含头文件的 cpp/h 文件中执行操作。

因此,不能排除在头文件中定义的变量。如果它们在 cpp 文件中并且你想禁止 extern,你可以使用匿名命名空间:

namespace
{
    int variable;
}

显然,最佳做法是根本不使用全局变量。它被认为是糟糕的风格有几个原因,比如可读性、难以确定依赖性、测试困难、扩展软件的机会很小等等。因此,如果重构不是此处的选项,您可能会为下一个项目重新考虑这种架构。

一种方法是在其周围放置一个 class 而不是命名空间,从而使该 class 的所有函数 public 静态方法和全局变量成为私有静态变量。

即:

head.h:

class A
{
  public:
    template <typename T> static void MethodA(T const &value)
    {
      //...
    }
    inline static void MethodB(int a, int b)
    {
      // ...
    }

  private:
    static int x;
    static std::string y;
};

head.cpp:

int A::x = 0;
std::string A::y;

编辑:

另一种替代方法是将全局变量定义为 class 中的私有静态变量,并使所有允许使用它们的函数成为友元函数:

head.h:

template <typename T> void FunctionA(T const &value);
void FunctionB(int a, int b);

class Vars
{
  friend template <typename T> void FunctionA(T const &value);
  friend FunctionB(int a, int b);

  private:
    static int x;
    static std::string y;
};

template <typename T> void FunctionA(T const &value)
{
  // ...
  // ... A::x ...
  // ...
}
inline void FunctionB(int a, int b)
{
  // ...
  // ... A::y ...
  // ...
}

head.cpp:

int A::x = 0;
std::string A::y;