嵌入式C编程中的全局变量重复声明问题
2017-12-15 10:11
579 查看
用C语言编写程序的时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同的c文件中,希望这个全局变量能在两个文件中共用。比如在子函数led.c的头文件led.h中声明了一个全局变量int
i,而led.h即包含在main.c中,又包含在led.c中,所有有些人就天真的认为,这样就可以正常使用,但你编译的时候,就会出现如下报错:
..\OBJ\test.axf: Error: L6200E: Symbol TimingDelay multiply defined (by systick.o and main.o).
也就是说编译器认为我们重复定义了i这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和led.c中都执行了一次int
i,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量i,编译器就认为是重复定义。
正确解决的办法如下:
(1)main.c
#include"led.h"
int i; //定义一个全局变量
(2)led.c
#include"led.h"
extern int i;//申明这个变量为外部变量,是在其他的c文件中定义的全局变量。
注意声明和定义不一样,定义会分配变量空间,而声明的话就不再分配空间,只是告诉编译器,这个变量在别的地方,我只是使用它。
i,而led.h即包含在main.c中,又包含在led.c中,所有有些人就天真的认为,这样就可以正常使用,但你编译的时候,就会出现如下报错:
..\OBJ\test.axf: Error: L6200E: Symbol TimingDelay multiply defined (by systick.o and main.o).
也就是说编译器认为我们重复定义了i这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和led.c中都执行了一次int
i,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量i,编译器就认为是重复定义。
正确解决的办法如下:
(1)main.c
#include"led.h"
int i; //定义一个全局变量
(2)led.c
#include"led.h"
extern int i;//申明这个变量为外部变量,是在其他的c文件中定义的全局变量。
注意声明和定义不一样,定义会分配变量空间,而声明的话就不再分配空间,只是告诉编译器,这个变量在别的地方,我只是使用它。
相关文章推荐
- C/C++语言中全局变量重复定义问题的解决方法
- 线程间通信之信号量(多文件编程,全局变量的问题)
- 关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 全局变量的声明的问题
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
- c++语言 全局变量 可声明问题
- 嵌入式C编程经验 之 全局变量猛于虎
- Objective-C编程:在类的外部声明全局变量
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 嵌入式C编程经验 之 全局变量猛于虎
- var声明用来计数的循环变量泄漏为全局变量问题
- 嵌入式C编程经验 之 全局变量猛于虎
- 全局变量的定义、声明、应用问题综合
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
- keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- 解决多重定义问题/如何声明全局变量让多个cpp文件使用
- 解决C/C++语言中全局变量重复定义的问题
- 嵌入式C编程经验之全局变量猛于虎
- 有关QT中声明一个vector为全局变量的初始化问题
- 嵌入式C编程经验 之 全局变量猛于虎