初始化"/>
C++头文件中变量不能进行初始化
C++头文件中变量不能进行初始化,否则会发生error: ‘array’ does not name a type array.push_back(1); 重定义错误
在DataDef.h
头文件中的代码如下:
#ifndef DATA_DEF_H_
#define DATA_DEF_H_#include <vector>std::vector<int> array;
array.push_back(1);
array.push_back(2);#endif
这时如果编译会发生error: 'array' does not name a type array.push_back(1);
,这是因为array
属于全局变量,它的初始化在头文件中,而当多个源文件包含了该头文件时就会出现对这个全局变量重复定义的错误。
但有可能会有人提出疑问:这个代码不是已经有头文件保护(#ifndef、#define、#endif)了吗?
当你在头文件中定义和初始化一个全局变量时,并使用了头文件保护(#ifndef、#define、#endif),确实可以防止同一个源文件多次包含该头文件,避免了重复定义的错误。
然而,如果你在多个源文件中包含了这个头文件,那么每个源文件都会有自己的一份全局变量的定义和初始化,这就违反了 C++ 的 One Definition Rule 规则,因为同一个全局变量在多个源文件中被定义和初始化多次。
当链接器尝试将这些源文件合并成一个可执行文件时,就会发现同一个全局变量有多个定义,从而产生重定义错误。
所以,即使使用了头文件保护,也不能解决在多个源文件中对同一个全局变量进行初始化的问题。
为了避免这种重定义错误,应该将全局变量的定义放在一个源文件中,并在其他源文件中使用 extern 关键字进行声明,这样全局变量只会被定义一次,避免了重定义错误。
总结起来,使用头文件保护可以防止同一个源文件多次包含头文件,但不能解决在多个源文件中对同一个全局变量进行初始化的问题。为了遵守 One Definition Rule 规则,应该将全局变量的定义放在一个源文件中,并在其他源文件中使用 extern 关键字进行声明。这样就可以确保全局变量只被定义一次,并在整个程序中共享。
所以解决方法有两种:
第一种,是在DataDef.h
头文件中使用extern
关键字,代码如下:
//DataDef.h
#ifndef DATA_DEF_H_
#define DATA_DEF_H_extern std::vector<int> array;#endif//DataDef.cpp
#include<vector>
#include"DataDef.h"std::vector<int> array{1,2};
第二种就是把初始化包在一个函数里,当需要时再调用函数进行初始化,代码如下:
//DataDef.h
#ifndef DATA_DEF_H_
#define DATA_DEF_H_#include<vector>std::vector<int> array;void init(){std::vector<int> array{1,2};
}#endif//DataDef.cpp
#include"DataDef.h"int main(){init();//...对arry进行操作return 0;
}
更多推荐
C++头文件中变量不能进行初始化
发布评论