搜索
bottom↓
回复: 35

请老师们帮个忙,提示头文件里函数重复定义

[复制链接]

出0入0汤圆

发表于 2013-12-8 19:15:01 | 显示全部楼层 |阅读模式
请老师们帮个忙吧!自己编了一个头文件,编译时提示那个头文件的C文件里KEYSCAN_DRIVE.C(8): error C231: 'Ldelay': redefinition。(函数重复定义)改了几次名字也不行,从网上查了半天也没有什么有用的结果,请老师们帮个忙指导一下吧!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-8 19:28:31 | 显示全部楼层
无码无真相

出0入0汤圆

 楼主| 发表于 2013-12-8 19:35:51 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2013-12-8 19:37:39 | 显示全部楼层
#ifndef
#define xxx xxx

#endif

出0入0汤圆

发表于 2013-12-8 19:38:03 | 显示全部楼层
全部的啊///////////////////

出0入0汤圆

 楼主| 发表于 2013-12-8 19:40:16 | 显示全部楼层
好的!请稍等!

出0入0汤圆

发表于 2013-12-8 19:41:45 | 显示全部楼层
本帖最后由 lcofjp 于 2013-12-8 19:43 编辑

往往真相只有一个,就是你在某个地方include这个c文件了。或者你的头文件里面有类似的定义。

出0入0汤圆

发表于 2013-12-8 19:45:36 | 显示全部楼层
F5F5F5F5F5F5F5F5F5F5F5

出0入0汤圆

发表于 2013-12-8 19:45:54 | 显示全部楼层
F5F5F5F5F5F5F5F5F5F5F5

出0入0汤圆

 楼主| 发表于 2013-12-8 19:45:59 | 显示全部楼层

主程序
//13年12月9日备份

//驱动芯片名:S6B0741 IC

#include <reg52.h>

#include "128X128LCD_Drive.H"

#include "128X128LCD_Frame0.H"

#include "Shumu.H"

#include "KeyScan_Drive.H"


void main(void)
{       
       
        intial();

        Cllcd();

        LCD_Frame0();

        Xianshima();
       
        while(1)
        {
                kaiguan();
        }
       
}
相关头文件
#ifndef __KeyScan_Drive_H__
#define __KeyScan_Drive_H__
#include <reg52.h>

#include "KeyScan_Drive.H"
extern Ldelay();
extern kaiguan();            
#endif

C文件

#include <reg52.h>
#include "KeyScan_Drive.H"

void Ldelay( )
{
        int i;
        for(i=1000;i>0;i--);
}
unsigned char kaiguan()
{
        unsigned char row;
        unsigned char tier;
        P3=0xf0;
        if((P3&0xf0)!=0xf0)
        {
                switch(P3)
                {
                        case 0x70:
                                row=1;break;
                        case 0xb0:
                                row=2;break;
                        case 0xd0:
                                row=3;break;
                        case 0xe0:
                                row=4;break;
                        default:
                                break;
                }
                Ldelay();
                P3=0x0f;
                if((P3&0x0f)!=0x0f)
                {
                        switch(P3)
                        {
                                case 0x07:
                                        tier=1;break;
                                case 0x0b:
                                        tier=2;break;
                                case 0x0d:
                                        tier=3;break;
                                case 0x0e:
                                        tier=4;break;
                                default:
                                        break;
                        }
                        return 4*(row-1)+tier;
                }
        }
        else
        {
                return 0;
        }
}

出0入0汤圆

发表于 2013-12-8 19:48:39 | 显示全部楼层
#include "KeyScan_Drive.H"
extern Ldelay();
extern kaiguan();   

把返回值类型加上。把include语句去掉。

出0入0汤圆

 楼主| 发表于 2013-12-8 19:48:43 | 显示全部楼层
lcofjp 发表于 2013-12-8 19:41
往往真相只有一个,就是你在某个地方include这个c文件了。或者你的头文件里面有类似的定义。 ...

按提示应该是这样的,于是就改了函数名,还是不行。

出0入0汤圆

发表于 2013-12-8 19:49:57 | 显示全部楼层
void Ldelay( );  __KeyScan_Drive_H__头文件里面 直接写这个,不要写extern 然后main的文件里面 包含这个头文件就OK了

出0入0汤圆

 楼主| 发表于 2013-12-8 19:54:13 | 显示全部楼层
lcofjp 发表于 2013-12-8 19:48
#include "KeyScan_Drive.H"
extern Ldelay();
extern kaiguan();   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-12-8 19:56:03 | 显示全部楼层

注意,你的delay是void类型。还有你的#include指令明显是多余的。

出0入0汤圆

发表于 2013-12-8 19:57:57 | 显示全部楼层
zbazba 发表于 2013-12-8 19:49
void Ldelay( );  __KeyScan_Drive_H__头文件里面 直接写这个,不要写extern 然后main的文件里面 包含这 ...

extern 写不写是无所谓的。写上也不会错

出0入0汤圆

发表于 2013-12-8 19:58:01 | 显示全部楼层
恩 楼上说的对 再包含自己干嘛 我没有仔细看 

出0入0汤圆

 楼主| 发表于 2013-12-8 21:18:58 | 显示全部楼层
lcofjp 发表于 2013-12-8 19:57
extern 写不写是无所谓的。写上也不会错



还是不行的,一样地错误提示。还有一点我忘了说了,是这样的,一开始做头文件的时候因为不熟,所以一步一步的跟着资料写还行。因为此程序对于我来说有点大,看着有点乱,所以就想多做几个头文件。其前面两个头文件也出现过此类问题,第一个误打误撞改对了,一头雾水不知所以然。写第二个头文件的时候吸取了第一个的教训,把程序放在主程序里编译通过并下载实验通过后,再拿出来往头文件里写,又出现了此问题,经过反复修改还是不行,于是乎我想,第一个不是通过了吗,我把第一个头文件里一个函数名后面随便加了一个字字母放当作第二个头文件里替换刚才通不过的函数名,居然成功了,然后又改成别的名字就行了。然后就碰到现在这个了,因为大家都是搞技术的很辛苦的,实在没辙才麻烦大家,先谢谢诸位好心的师友!

出0入0汤圆

 楼主| 发表于 2013-12-8 21:20:23 | 显示全部楼层
zbazba 发表于 2013-12-8 19:58
恩 楼上说的对 再包含自己干嘛 我没有仔细看 

还有一点我忘了说了,是这样的,一开始做头文件的时候因为不熟,所以一步一步的跟着资料写还行。因为此程序对于我来说有点大,看着有点乱,所以就想多做几个头文件。其前面两个头文件也出现过此类问题,第一个误打误撞改对了,一头雾水不知所以然。写第二个头文件的时候吸取了第一个的教训,把程序放在主程序里编译通过并下载实验通过后,再拿出来往头文件里写,又出现了此问题,经过反复修改还是不行,于是乎我想,第一个不是通过了吗,我把第一个头文件里一个函数名后面随便加了一个字字母放当作第二个头文件里替换刚才通不过的函数名,居然成功了,然后又改成别的名字就行了。然后就碰到现在这个了,因为大家都是搞技术的很辛苦的,实在没辙才麻烦大家,先谢谢诸位好心的师友!

出0入0汤圆

发表于 2013-12-8 21:46:33 | 显示全部楼层
你把代码传上来,不自己编译发现不了的

出0入0汤圆

 楼主| 发表于 2013-12-8 21:55:29 | 显示全部楼层
sunocean 发表于 2013-12-8 21:46
你把代码传上来,不自己编译发现不了的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-12-8 22:58:39 | 显示全部楼层
已经在11楼回复你了,可能你也没仔细理会
#ifndef __KeyScan_Drive_H__
#define __KeyScan_Drive_H__
#include <reg52.h>

/*#include "KeyScan_Drive.H"*/
extern void Ldelay();
extern unsigned char KeyScan_Drive();            
#endif

出0入0汤圆

发表于 2013-12-8 23:37:39 | 显示全部楼层
22楼正解,
头文件KeyScan_Drive.H中的#include "KeyScan_Drive.H"这句话多余了

出0入0汤圆

发表于 2013-12-8 23:43:39 | 显示全部楼层
同文件里加条件编译 会解决重复包含的问题

出0入0汤圆

发表于 2013-12-9 00:57:34 | 显示全部楼层
extern 不能放在.h文件里,,

出0入0汤圆

发表于 2013-12-9 02:11:07 | 显示全部楼层
撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,


这个可以放。。。

出0入0汤圆

发表于 2013-12-9 11:44:00 | 显示全部楼层
撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

打开.lib对应的.h 里面全是这种写法

出0入0汤圆

 楼主| 发表于 2013-12-9 13:21:15 | 显示全部楼层
本帖最后由 MCUStudent 于 2013-12-9 13:25 编辑
lcofjp 发表于 2013-12-8 22:58
已经在11楼回复你了,可能你也没仔细理会
#ifndef __KeyScan_Drive_H__
#define __KeyScan_Drive_H__


谢谢您的解答,你说的方法我已经试过,又试了一遍还是不行。最新进展,经过诸位老师的指导,原来是提示两个函数重定义,现在变成一个了。早晨把整个工程的文件夹拷贝后带到另外一台笔记本上编译,和家里电脑一样。就是指把此函数注销掉编译通过,又重新把函数释放(去除注销标记)居然编译通过,不知所以然,一头雾水,期待正解!

我已经把源发到21楼了,码不知您编译的结果怎么样。

出0入0汤圆

 楼主| 发表于 2013-12-9 13:23:28 | 显示全部楼层
本帖最后由 MCUStudent 于 2013-12-9 13:26 编辑
iquer 发表于 2013-12-8 23:37
22楼正解,
头文件KeyScan_Drive.H中的#include "KeyScan_Drive.H"这句话多余了


谢谢您的解答,你说的方法我已经试过,又试了一遍还是不行。最新进展,经过诸位老师的指导,原来是提示两个函数重定义,现在变成一个了。早晨把整个工程的文件夹拷贝后带到另外一台笔记本上编译,和家里电脑一样。就是指把此函数注销掉编译通过,又重新把函数释放(去除注销标记)居然编译通过,不知所以然,一头雾水,期待正解!

我已经把源发到21楼了,码不知您编译的结果怎么样

出0入0汤圆

 楼主| 发表于 2013-12-9 13:27:46 | 显示全部楼层
zbazba 发表于 2013-12-8 19:58
恩 楼上说的对 再包含自己干嘛 我没有仔细看 

谢谢您的解答,你说的方法我已经试过,又试了一遍还是不行。最新进展,经过诸位老师的指导,原来是提示两个函数重定义,现在变成一个了。早晨把整个工程的文件夹拷贝后带到另外一台笔记本上编译,和家里电脑一样。就是指把此函数注销掉编译通过,又重新把函数释放(去除注销标记)居然编译通过,不知所以然,一头雾水,期待正解!

我已经把源发到21楼了,码不知您编译的结果怎么样

出0入0汤圆

发表于 2013-12-9 14:58:35 | 显示全部楼层
#ifndef __KeyScan_Drive_H__
#define __KeyScan_Drive_H__
#include <reg52.h>

/*#include "KeyScan_Drive.H"*/
extern void Ldelay();
extern unsigned char KeyScan_Drive();            
#endif
你21楼的程序唯一的错误就是头文件中Ldelay的返回值不对,应该是void的,我已经给你改正了,你自己不注意看,我发现你是来问问题的吗,不注意看大家的回复有意义吗?
到此为止,如果你继续发问,我就觉得你是脑子有问题了,我也没必要再说什么。

出0入0汤圆

发表于 2013-12-9 15:03:16 | 显示全部楼层
撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

你基础不好就不要来误导人了。

出0入0汤圆

发表于 2013-12-10 00:54:20 | 显示全部楼层
lcofjp 发表于 2013-12-9 15:03
你基础不好就不要来误导人了。

我只是来抛砖引玉的,,没想到你来个更大的砖~~~~

出0入0汤圆

发表于 2013-12-10 00:57:31 | 显示全部楼层
撸主 提问了又不认真看别人的回复

出0入42汤圆

发表于 2013-12-10 08:19:21 | 显示全部楼层
撒手归路 发表于 2013-12-10 00:54
我只是来抛砖引玉的,,没想到你来个更大的砖~~~~

这砖来的好

出0入0汤圆

发表于 2013-12-10 08:43:24 | 显示全部楼层
撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

这砖抛得。。。


.c和.h里面什么内容都可以写

只是大家都比较注意习惯。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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