声明和初始化全局变量
声明和初始化全局变量
也许这是基本的知识,我很抱歉。
我有一个名为CTemp.h的头文件,其中包含CTemp命名空间:
namespace CTemp { bool bFlag; }; #ifndef _CTEMP #define _CTEMP bool CTemp::bFlag = true; #endif
如果我将CTemp.h包含到我的cpp文件中,并尝试使用CTemp::bFlag
bool bb = CTemp::bFlag;
编译器会报错"redefinition"
我确信应该将初始化放在.cpp文件中,但我找到了一种只使用.h文件解决的方法。因为我不想将.cpp文件添加到我的项目中。
我认为可以使用预处理指令#ifdef...来解决它。
感谢您的建议。
全局变量的声明和初始化问题
问题是bool bFlag
和bool CTemp::bFlag = true;
都是定义。换句话说,当你写下bool bFlag = true;
时,你正在第二次定义bFlag
。
解决方法
为了解决这个问题,你可以使用extern
关键字。
在someheader.h中:
#ifndef _CTEMP #define _CTEMP namespace CTemp { extern bool bFlag; //这是一个声明而不是定义 }; #endif
在somesource.cpp中:
#include "someheader.h" bool CTemp::bFlag = true; //这是一个定义
全局变量的声明和初始化是一个常见的问题,特别是在C++中。通常情况下,我们希望在头文件中声明变量,并在源文件中进行定义和初始化。然而,如果不正确地处理全局变量的声明和初始化,就会出现一些问题。
在上面的代码示例中,我们可以看到两种处理全局变量声明和初始化的方法。
第一种方法是在头文件中声明变量,然后在一个单独的源文件中定义变量并进行初始化。在头文件中,我们使用了关键字"extern"来声明变量,表示我们只是声明变量,而不进行定义和初始化。在源文件中,我们使用了"#include"指令来包含头文件,并且使用了全局作用域运算符"::"来定义变量并进行初始化。
第二种方法是将变量定义为"inline"。在头文件中,我们使用了关键字"inline"来定义变量,并进行了初始化。在这种情况下,我们不需要在源文件中再次定义变量。需要注意的是,尽管"inline"定义的变量不再需要在源文件中进行定义,但它仍然是全局变量。
这两种方法都可以解决全局变量声明和初始化的问题,具体使用哪种方法取决于实际需求和编程风格。
总之,正确处理全局变量的声明和初始化是非常重要的,特别是在C++中。使用"extern"关键字和源文件中的定义来实现声明和初始化,或者使用"inline"关键字在头文件中直接定义和初始化变量,可以有效地解决这个问题。