C ++变量头范围

时间:2016-02-17 15:55:18

标签: c++ scope extern

我在标头文件中定义了许多 templatic 内联函数(让我们称之为{{1} })。目前,这些函数使用在同一标头中用head.h声明的一些全局变量,并在一个 .cpp 中的某处定义。

一切正常,但我会将全局变量范围仅限于定义它们的标题。

换句话说,包含我的 head.h 的其他每个 .h .cpp 都无法看到这样的内容全局变量。

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

3 个答案:

答案 0 :(得分:2)

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

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

namespace
{
    int variable;
}

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

答案 1 :(得分:1)

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

即:

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;

修改

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

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;

答案 2 :(得分:0)

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