C++:重定义:符号重定义:变量重定义_hongwen_yul的博客-CSDN博客
上一篇文章中,我们知道解决变量重复定义其中一个办法是:尽量不要头文件中定义变量,头文件只做变量的声明。但是如果我们一定要在头文件中定义,那应该怎么处理了 ?
a.h#pragma once
const int A = 2;=====================================================================================b.h / b.cpp 代码保持不变,并且按照正常编译指令编译成 b.o 即:
gcc -c b.cpp -o b.o====================================================================================c.h/c.cpp 代码也保持不变, 按照正常编译指令编译成 c.o 即:
gcc -c c.cpp -o c.o====================================================================================main.cpp 代码保持不变,按照正常编译指令编译成 main.o 即:
gcc -c mian.cpp -o main.o==================================================================================链接: 我们使用指令将 b.o / c.o/ mian.o 三个文件链接起来 即:gcc b.o c.o main.o -o main.exe发现并没有报错,可以正常运行,并可以正常打印出相关数值。
为什么变量用 const 修饰后,就不报错了 ?
在 C 语言中,对于被声明为 static 的全局实体(包括变量和函数),在声明它的文件之外是不可见的。这句话来自于C++ Primer一书,如下所示:

那既然有了上面的理论依据,我们可以将 a.h 头文件里面的变量 A定义成 static
a.h#pragma once
static int A = 2;=====================================================================================b.h / b.cpp 代码保持不变,并且按照正常编译指令编译成 b.o 即:
gcc -c b.cpp -o b.o====================================================================================c.h/c.cpp 代码也保持不变, 按照正常编译指令编译成 c.o 即:
gcc -c c.cpp -o c.o====================================================================================main.cpp 代码保持不变,按照正常编译指令编译成 main.o 即:
gcc -c mian.cpp -o main.o==================================================================================链接: 我们使用指令将 b.o / c.o/ mian.o 三个文件链接起来 即:gcc b.o c.o main.o -o main.exe发现并没有报错,可以正常运行,并可以正常打印出相关数值。
上一篇:51单片机笔记:定时器/计数器
下一篇:我的酒是故意的,我的食物是隐藏的