c++在头文件中定义变量引起的重复定义
以前有很多博客讲过,大家可以把全局变量定义在某个头文件中,使用的时候直接include就好。但是我此前并未实践过,如今第一次实践就发现不对劲。
错误展示
错误情况1
a.cpp
#include "a.h"
num = 100;
a.h
int num;
//下面是a.h的类定义,所以就不贴了
错误显示
this declaration has no storage class or type specifier
错误原因:对变量的赋值一般不能放在函数外,只有在定义全局变量时的初始化才能被允许。如果要在函数外定义变量,要么就不要赋值定义,要么就在声明之后立刻定义。
这就意味着我们平时在对变量进行赋值时要么直接在初始化的时候一步到位,要么在函数里再进行修改。
错误情况2
a.h
#include "a.h"
int num = 100;
b.cpp
#include "b.h"
#include "a.h"
#include "stdio.h"
extern int num;
void b::print(){
printf("%d\n",num);
}
c.cpp
#include "a.h"
#include "b.h"
#include "c.h"
#include "stdio.h"
extern int num;
void c::print(){
b bi;
bi.print();
printf("%d\n",num);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sa5FTsSh-1692081982895)(C:\Users\oc\AppData\Roaming\Typora\typora-user-images\image-20230815135201714.png)]
意思是重复定义,在链接的时候出错了,这种在.h文件中定义,让其他文件include并使用extern声明似乎是我们的理想方法,但这并不符合编译器的操作。
大家可以参见这张图,首先是各自的h文件和cpp文件生成.o文件,然后所有的.o文件就会进行链接。如果我们把全局变量定义在a.h文件中,之后的b.h和c.h会都include 这个变量,同时各自生成b.o和c.o。当进行链接时就会发现双方都有关于全局变量的定义,所以导致报错重复定义。正确的做法是将变量在.cpp变量进行声明定义,然后在其他地方使用时用extern进行声明即可。
会发现双方都有关于全局变量的定义,所以导致报错重复定义。正确的做法是将变量在.cpp变量进行声明定义,然后在其他地方使用时用extern进行声明即可。