http://zhidao.baidu.com/question/357076310.html?oldq=1
我百度了一下头文件的作用如下:
1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户
提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级
目录)。
如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声明”。为了加强
信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然而具体该怎么用呢?
以zlg的某工程为例:
截取main.c开头某一段:
.....
#include "hw_memmap.h"
#include "hw_ints.h"
#include "hw_types.h"
#include "interrupt.h"
#include "gpio.h"
#include "sysctl.h"
#include "Systick.h"
#include "Timer.h"
#include "Pwm.h"
#include "Type.h"
...
中gpio.h为例,大致包含宏定义和函数声明,截取如下
...
#define GPIO_PIN_3 0x00000008 // GPIO pin 3
#define GPIO_PIN_4 0x00000010 // GPIO pin 4
...
extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins,
unsigned long ulPinIO);
extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin);
...
函数的实现是在同目录下得gpio.c中实现的
gpio.c截取如下:
#include "../hw_gpio.h"
#include "../hw_ints.h"
#include "../hw_memmap.h"
#include "../hw_types.h"
#include "debug.h"
#include "gpio.h"
.....
void
GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTA_AHB_BASE) ||
(ulPort == GPIO_PORTB_BASE) || (ulPort == GPIO_PORTB_AHB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTC_AHB_BASE) ||
(ulPort == GPIO_PORTD_BASE) || (ulPort == GPIO_PORTD_AHB_BASE) ||
(ulPort == GPIO_PORTE_BASE) || (ulPort == GPIO_PORTE_AHB_BASE) ||
(ulPort == GPIO_PORTF_BASE) || (ulPort == GPIO_PORTF_AHB_BASE) ||
(ulPort == GPIO_PORTG_BASE) || (ulPort == GPIO_PORTG_AHB_BASE) ||
(ulPort == GPIO_PORTH_BASE) || (ulPort == GPIO_PORTH_AHB_BASE));
//
// Enable the interrupts.
//
HWREG(ulPort + GPIO_O_IM) |= ucPins;
}
....
我的问题是:
1、main.c和gpio.c都包含了gpio.h。
然而当程序从main函数开始执行后,遇到include"gpio.h"将gpio.h内容“拷贝”到mian.c中,当函数执行到GPIOPinIntEnable()函数时整个工程并不包含gpio.c的内容。如何实现GPIOPinIntEnable()的算法的呢。(编译器怎么知道存在gpio.c这个文件并从中搜索)
2.我在zlg的任意一个头文件里没有看到包含别个系统自带和自建的头文件,和具体算法实现。和网上一些资料不一致。
3.zlg的库能够实现函数的算法隐藏,而只讲接口公布出来。其原理在哪?(回到第一个问题)
以引用摘自Luminary库。
问题补充: gpio.h和gpio.c应该放在什么位置
与mian.c同目录还是source目录下?
|