C++ 变量 header 作用域
C++ variable header scope
我在 header[=28 中定义了一些 templatic 和 inline 函数=] 文件(我们称之为 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;
我在 header[=28 中定义了一些 templatic 和 inline 函数=] 文件(我们称之为 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;