打印
[PIC®/AVR®/dsPIC®产品]

关于使用C语言进行多文件编译无法通过

[复制链接]
1450|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunflower860|  楼主 | 2013-10-13 23:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学,最近用PICC测试多文件编译,遇到了以解决不了的问题:

三个文件如下:

第一个main.c:
#include <htc.h>
#include "Start.h"
#include "Start.c"

__CONFIG(FOSC_HS & WDTE_ON & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_ON & CP_OFF);

void main()
{       
    Key_flag = 0xff;
    TRISB = 0x00;
    SSS(Key_flag);
    while(1)
    {
    }
}

第二个Start.h:

#define uchar unsigned char
#define uint unsigned int

volatile uchar Key_flag;

第三个Start.c:

#include <htc.h>

#define uchar unsigned char
#define uint unsigned int

void SSS(uchar i)
{
     PORTB = i;
}

编译无法通过,总显示:
Error   [237] D:\TEST\Start.c; 11. function "_SSS" redefined
另外,如果将后两个文件从工程中移除,编译就能通过。
请各位大仙指正。
沙发
ballack_linux| | 2013-10-14 00:43 | 只看该作者
你这个问题很明显是重复定义了SSS这个函数,产生这个问题是因为你重复包含了文件。
首先,htc.h文件的内容是什么?
第二,不推荐包含.c文件,你只需要包含其对应的头文件即可,在头文件里面声明.c文件中的函数。
在你这个程序里面,start.c完全没必要包含,只需要在start.h里面加多一句void SSS(char i);,然后只包含start.h就行。
还有,头文件要用#ifndef和#endif 括起来,防止头文件重复包含。
例子如下:
#ifndef _START_H_
#define _START_H_



#endif

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sunflower860 + 1 确实很对
板凳
sunflower860|  楼主 | 2013-10-14 08:56 | 只看该作者
ballack_linux 发表于 2013-10-14 00:43
你这个问题很明显是重复定义了SSS这个函数,产生这个问题是因为你重复包含了文件。
首先,htc.h文件的内容 ...

很好很全面!htc.h文件是对特殊寄存器的定义,Start.c中不加不行,否则PORTB无法识别。但按你第二中的做法做过之后,确实就OK了。

使用特权

评论回复
地板
ballack_linux| | 2013-10-14 11:46 | 只看该作者
sunflower860 发表于 2013-10-14 08:56
很好很全面!htc.h文件是对特殊寄存器的定义,Start.c中不加不行,否则PORTB无法识别。但按你第二中的做 ...

恩 那就行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

18

帖子

0

粉丝