我在标头文件中定义了许多 templatic 和内联函数(让我们称之为{{1} })。目前,这些函数使用在同一标头中用head.h
声明的一些全局变量,并在一个 .cpp 中的某处定义。
一切正常,但我会将全局变量范围仅限于定义它们的标题。
换句话说,包含我的 head.h 的其他每个 .h 或 .cpp 都无法看到这样的内容全局变量。
有什么方法可以达到这个结果吗?
答案 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的任何其他标头中可用。