有关C++多文件重定义的问题

图片说明
如图所示,有一个头文件,两个cpp文件
num定义在头文件中
请问为什么num会多重定义
使用宏定义#ifndef...不能避免吗

int num = 50; 这句是定义语句。
头文件里面应该只声明变量,在cpp文件里面定义变量。
要明白声明和定义的区别,重定义即多个定义,对于编译器来说这是不允许的。
声明可以多次声明,但是定义是不允许多个的。
在hd.h里面已经定义了变量num,main.cpp里面包含了头文件hd.h,在预编译阶段,main.cpp里面也会有一个num变量的定义,两个地方都定义了同一个变量,并且都是全局作用域,自然就重定义了。

头文件 里面声明变量num

extern int num; 

cpp里面定义变量num

int num = 50;

就像你在hd.h里面声明了函数void fun(); 在hd.cpp里面定义了fun,这样做是正确的。如果把函数的实现写在头文件里面同样会报fun函数重定义的错误。