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
-
- 发现并没有报错,可以正常运行,并可以正常打印出相关数值。
参考文献