当前位置: 代码迷 >> 单片机 >> 求教大神:C语言(Keil μVision)里为什么定义头文件程序就会异常
  详细解决方案

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

热度:341   发布时间:2016-04-28 15:33:42.0
求教大神: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++也除外。
  相关解决方案