首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

求教大神:C语言(Keil μVision)里为什么定义头文件程序就会异常

2013-01-08 
求教大神:C语言(Keil μVision)里为什么定义头文件程序就会错误打个比方:存在如下文件:---------文件名dela

求教大神:C语言(Keil μVision)里为什么定义头文件程序就会错误
打个比方:
存在如下文件:
---------文件名delay_api.c-----------------


#include<delay_api.h>
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

#define nMHZ 12 //晶振频率

void msdelay(uint i){
uint x,j,clk;
clk=nMHZ*12;
for(j=0;j<i;j++)
    for(x=0;x<=clk;x++);

}
void macdelay(uint i){
uint j;
for(j=0;j<i;j++);
}

----------文件名delay_api.h-----------------

#ifndef DELAY_API_H
#define DELAY_API_H
extern void macdelay(unsigned int i);
extern void msdelay(unsigned int i);
#endif

在主程序中首部加入#include<delay_api.h>
引用两个函数都是正常的,但是一到单片机上程序实战,就挂了……
最后我是这么解决的:

#ifndef _DELAY_API_C
#define _DELAY_API_C
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

#define nMHZ 12 //晶振频率

void msdelay(uint i){
uint x,j,clk;
clk=nMHZ*12;
for(j=0;j<i;j++)
    for(x=0;x<=clk;x++);

}
void macdelay(uint i){
uint j;
for(j=0;j<i;j++);
}

#endif

然后引用delay_api.c,编译通过,运行正常
但是这样的话,如果有一天我写一个DS18B20的驱动程序,里面有个reset函数,然后另外某个驱动程序里面也有reset函数,不久冲突了吗?请问怎样使用H文件作为C程序的接口?
[解决办法]
表示没看懂你是怎么挂的

在主程序中首部加入#include<delay_api.h>
引用两个函数都是正常的,但是一到单片机上程序实战,就挂了……

首先,你在keil中设置了包含目录了么,设置的对么。

其次,自己定义的头文件建议用#include "delay_api.h",当然#include <delay_api.h>也不算错。

再次,即使你用正常的方式包含头文件,一个工程里也不能有两个函数重名(也就是说不能有两个函数都叫reset) ,当然,类似STM32中的弱函数除外,C++也除外。

热点排行