MCUStudent 发表于 2013-12-8 19:15:01

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

请老师们帮个忙吧!自己编了一个头文件,编译时提示那个头文件的C文件里KEYSCAN_DRIVE.C(8): error C231: 'Ldelay': redefinition。(函数重复定义)改了几次名字也不行,从网上查了半天也没有什么有用的结果,请老师们帮个忙指导一下吧!

zbazba 发表于 2013-12-8 19:28:31

无码无真相

MCUStudent 发表于 2013-12-8 19:35:51

zbazba 发表于 2013-12-8 19:28
无码无真相

liwei_jlu 发表于 2013-12-8 19:37:39

#ifndef
#define xxx xxx

#endif

zbazba 发表于 2013-12-8 19:38:03

全部的啊///////////////////

MCUStudent 发表于 2013-12-8 19:40:16

好的!请稍等!

lcofjp 发表于 2013-12-8 19:41:45

本帖最后由 lcofjp 于 2013-12-8 19:43 编辑

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

zbazba 发表于 2013-12-8 19:45:36

F5F5F5F5F5F5F5F5F5F5F5

zbazba 发表于 2013-12-8 19:45:54

F5F5F5F5F5F5F5F5F5F5F5

MCUStudent 发表于 2013-12-8 19:45:59

MCUStudent 发表于 2013-12-8 19:40
好的!请稍等!

主程序
//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;
        }
}

lcofjp 发表于 2013-12-8 19:48:39

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

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

MCUStudent 发表于 2013-12-8 19:48:43

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

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

zbazba 发表于 2013-12-8 19:49:57

void Ldelay( );  __KeyScan_Drive_H__头文件里面 直接写这个,不要写extern 然后main的文件里面 包含这个头文件就OK了

MCUStudent 发表于 2013-12-8 19:54:13

lcofjp 发表于 2013-12-8 19:48
#include "KeyScan_Drive.H"
extern Ldelay();
extern kaiguan();   


lcofjp 发表于 2013-12-8 19:56:03

MCUStudent 发表于 2013-12-8 19:54


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

lcofjp 发表于 2013-12-8 19:57:57

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

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

zbazba 发表于 2013-12-8 19:58:01

恩 楼上说的对 再包含自己干嘛 我没有仔细看 

MCUStudent 发表于 2013-12-8 21:18:58

lcofjp 发表于 2013-12-8 19:57
extern 写不写是无所谓的。写上也不会错



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

MCUStudent 发表于 2013-12-8 21:20:23

zbazba 发表于 2013-12-8 19:58
恩 楼上说的对 再包含自己干嘛 我没有仔细看 

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

sunocean 发表于 2013-12-8 21:46:33

你把代码传上来,不自己编译发现不了的

MCUStudent 发表于 2013-12-8 21:55:29

sunocean 发表于 2013-12-8 21:46
你把代码传上来,不自己编译发现不了的

lcofjp 发表于 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

iquer 发表于 2013-12-8 23:37:39

22楼正解,
头文件KeyScan_Drive.H中的#include "KeyScan_Drive.H"这句话多余了

lulinchen 发表于 2013-12-8 23:43:39

同文件里加条件编译 会解决重复包含的问题

撒手归路 发表于 2013-12-9 00:57:34

extern 不能放在.h文件里,,

RelayProtect 发表于 2013-12-9 02:11:07

撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

这个可以放。。。

sunocean 发表于 2013-12-9 11:44:00

撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

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

MCUStudent 发表于 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楼了,码不知您编译的结果怎么样。

MCUStudent 发表于 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楼了,码不知您编译的结果怎么样

MCUStudent 发表于 2013-12-9 13:27:46

zbazba 发表于 2013-12-8 19:58
恩 楼上说的对 再包含自己干嘛 我没有仔细看 

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

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

lcofjp 发表于 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的,我已经给你改正了,你自己不注意看,我发现你是来问问题的吗,不注意看大家的回复有意义吗?
到此为止,如果你继续发问,我就觉得你是脑子有问题了,我也没必要再说什么。

lcofjp 发表于 2013-12-9 15:03:16

撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

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

撒手归路 发表于 2013-12-10 00:54:20

lcofjp 发表于 2013-12-9 15:03
你基础不好就不要来误导人了。

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

bailangcn 发表于 2013-12-10 00:57:31

撸主 提问了又不认真看别人的回复

albert_w 发表于 2013-12-10 08:19:21

撒手归路 发表于 2013-12-10 00:54
我只是来抛砖引玉的,,没想到你来个更大的砖~~~~

这砖来的好

xou822 发表于 2013-12-10 08:43:24

撒手归路 发表于 2013-12-9 00:57
extern 不能放在.h文件里,,

这砖抛得。。。


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

只是大家都比较注意习惯。。。
页: [1]
查看完整版本: 请老师们帮个忙,提示头文件里函数重复定义