OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4128|回复: 21

编译老是显示重复定义

[复制链接]

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
发表于 2017-7-10 11:26:34 | 显示全部楼层 |阅读模式
10金钱
1.png 2.png
编译老是显示重复定义,实际上就一个地方定义了,这是为啥



最佳答案

查看完整内容[请看2#楼]

尽量不要在头文件定义变量。 一般的头文件里用的#ifndef, #define, #endif这几个预编译指令,解决的是一个.c或.cpp文件编译时的重复包含问题,否则会出现类型重复定义问题:"error C2011: 'xxx' : 'class' type redefinition" 而如果在头文件中定义了默认命名空间的变量,那么如果工程中有多个.c或.cpp文件包含了该头文件,在这几个源文件编译后的目标文件.obj中均包含有该变量,于是在链接时会再报一个变量重复定义的错误 你 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-10 11:26:35 | 显示全部楼层
heiheihaha 发表于 2017-7-11 14:31
我前面加了static 编译是没问题了,但是我一直不明白#ifndef __LCD_H#define __LCD_H       
这个不就是防止重 ...

尽量不要在头文件定义变量。
一般的头文件里用的#ifndef, #define, #endif这几个预编译指令,解决的是一个.c或.cpp文件编译时的重复包含问题,否则会出现类型重复定义问题:"error C2011: 'xxx' : 'class' type redefinition"
而如果在头文件中定义了默认命名空间的变量,那么如果工程中有多个.c或.cpp文件包含了该头文件,在这几个源文件编译后的目标文件.obj中均包含有该变量,于是在链接时会再报一个变量重复定义的错误
你用static修饰之后可以使当前文件的数组变量对其他文件不可见。也就是说,你现在程序里依然存在好几份你定义的数组变量,只不过“骗过”编译器不报错了,但是会占很多存储空间
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-10 11:48:26 | 显示全部楼层
是不是没有用#ifndef  然后lcd.h被好几个文件包含了
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7261
金钱
7261
注册时间
2016-11-30
在线时间
625 小时
发表于 2017-7-10 11:56:44 | 显示全部楼层
头文件重复包含!
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-10 13:56:02 | 显示全部楼层
本帖最后由 heiheihaha 于 2017-7-10 14:02 编辑

这是main函数
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
这是lcd.c函数
#include "lcd.h"
#include "stdlib.h"
//#include "font.h"
//#include "usart.h"         
#include "delay.h"


         

回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-10 14:03:00 | 显示全部楼层
Owen 发表于 2017-7-10 11:48
是不是没有用#ifndef  然后lcd.h被好几个文件包含了

#ifndef  用在哪里
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-10 14:56:21 | 显示全部楼层
heiheihaha 发表于 2017-7-10 14:03
#ifndef  用在哪里

[mw_shl_code=applescript,true]#ifndef _TEST_H_
#define _TEST_H_

#include "stm32f2xx.h"
#define  int testarray[10];
void test_gpio_Init();

#endif[/mw_shl_code]
类似这样,你去百度一下#ifndef,解释的比较清楚
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-10 15:03:23 | 显示全部楼层
#ifndef __LCD_H
#define __LCD_H               
#include "sys.h"         
#include "stdlib.h"这个啊,都没有动啊,原本就是这样定义啊
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-11 12:02:57 | 显示全部楼层
heiheihaha 发表于 2017-7-10 15:03
#ifndef __LCD_H
#define __LCD_H               
#include "sys.h"         

你的jiong1数组在哪定义的,贴上来看看吧,或者你有没有使用extern jiong1?
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7261
金钱
7261
注册时间
2016-11-30
在线时间
625 小时
发表于 2017-7-11 13:25:43 | 显示全部楼层
你的lcd.h中包含了sys.h。
然后main.c里边包含了sys.h和lcd.h。
这不就等于你包含了两次sys.h嘛!
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2017-7-11 13:36:14 | 显示全部楼层
头文件里边不要定义任何数据,在C文件定义,然后头文件加个extern。估计是这个错误
我有故事,你有酒吗
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-11 14:31:33 | 显示全部楼层
Owen 发表于 2017-7-11 12:02
你的jiong1数组在哪定义的,贴上来看看吧,或者你有没有使用extern jiong1?

我前面加了static 编译是没问题了,但是我一直不明白#ifndef __LCD_H#define __LCD_H       
这个不就是防止重复定义吗,为啥还提示重复定义
1.png
在lcd.h



回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-11 15:37:53 | 显示全部楼层
谢谢您,这个变量要是不再头文件中定义,在哪里定义合适啊
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-11 15:54:20 | 显示全部楼层
Owen 发表于 2017-7-11 15:05
尽量不要在头文件定义变量。
一般的头文件里用的#ifndef, #define, #endif这几个预编译指令,解决的是一 ...

变成extern后 1.png
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7261
金钱
7261
注册时间
2016-11-30
在线时间
625 小时
发表于 2017-7-11 17:01:07 | 显示全部楼层

你这extern用的有问题啊!
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-11 19:47:43 | 显示全部楼层
heiheihaha 发表于 2017-7-11 15:37
谢谢您,这个变量要是不再头文件中定义,在哪里定义合适啊

定义在源文件中,比如lcd.c。如果你要在其他文件A中使用这个数据变量,可以在A中使用
extern  u8  jiong1[];
另外如果这个数组的值不需要改变的话,可以定义为const
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-7-11 20:00:49 | 显示全部楼层
lcd.c:
……
u8 a[4]={1,2,3,4};
……

lcd.h:
......
extern u8 a[4];
.......
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-13 12:40:17 | 显示全部楼层
lvkanger 发表于 2017-7-11 17:01
你这extern用的有问题啊!

为啥用extern会出现问题呢
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7261
金钱
7261
注册时间
2016-11-30
在线时间
625 小时
发表于 2017-7-17 09:11:07 | 显示全部楼层
heiheihaha 发表于 2017-7-13 12:40
为啥用extern会出现问题呢

extern 不能赋值!
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-7-17 09:15:43 | 显示全部楼层
点C文件里面定义:
u8 Master_Back_Data[2]={0x00,0x01};//给网络芯片
u8 Master_Send_Data[2]={0x00,0x01};//给面板
头文件引用:
extern u8 Master_Back_Data[];//给网络芯片
extern u8 Master_Send_Data[];//给面板
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-18 10:36:44 | 显示全部楼层
d1z1y2 发表于 2017-7-11 20:00
lcd.c:
……
u8 a[4]={1,2,3,4};

非常感谢您,明白了
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-5-6
在线时间
18 小时
 楼主| 发表于 2017-7-18 10:36:56 | 显示全部楼层
super910906 发表于 2017-7-17 09:15
点C文件里面定义:
u8 Master_Back_Data[2]={0x00,0x01};//给网络芯片
u8 Master_Send_Data[2]={0x00,0x0 ...

非常感谢您,明白了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-19 01:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表