如何使用头文件
我百度了一下头文件的作用如下: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目录下? 展开
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目录下? 展开
1个回答
展开全部
1. 不是“拷贝”而是“连接”,头文件与源文件没有一一对应的关系,头文件的作用只是为了“声明”,对函数来说告诉引用这个头文件的源文件某个函数是怎么存在的,这就跟你在一个C文件中写程序时候,在main()前面写一句 int funcOOXX();,然后跑到后面去实现int funcOOXX();是一个道理。
只不过如果几个文件都要调用int funcOOXX()的话,你要在多个c文件中写int funcOOXX();这个定义很多遍,当你修改这个函数时候也要改很多个声明,不方便。所以就出现了头文件,在头文件里声明一遍然后大家include就好。
此外,编译器不知道gpio.c存在吗?不,他也许人为的知道了,被IDE包裹的编译器有时候会骗你,但是你直接调用编译器 gcc main.c或者 cl main.c的时候会发现很可能编译不了。
也就是说,即使没有头文件,只有c文件,大家也能工作的很好,头文件和源文件对编译器来说根本不存在一一对应关系,大家有时起一样的名字只是为了看起来有些联系而已。
2. 有些库可能被隐藏的包含了。头文件里理所当然的难以看到具体算法实现。
3. 能隐藏源代码的只有编译好的二进制库,若是下载了源代码,那不是没有实现,你没找到而已。
只不过如果几个文件都要调用int funcOOXX()的话,你要在多个c文件中写int funcOOXX();这个定义很多遍,当你修改这个函数时候也要改很多个声明,不方便。所以就出现了头文件,在头文件里声明一遍然后大家include就好。
此外,编译器不知道gpio.c存在吗?不,他也许人为的知道了,被IDE包裹的编译器有时候会骗你,但是你直接调用编译器 gcc main.c或者 cl main.c的时候会发现很可能编译不了。
也就是说,即使没有头文件,只有c文件,大家也能工作的很好,头文件和源文件对编译器来说根本不存在一一对应关系,大家有时起一样的名字只是为了看起来有些联系而已。
2. 有些库可能被隐藏的包含了。头文件里理所当然的难以看到具体算法实现。
3. 能隐藏源代码的只有编译好的二进制库,若是下载了源代码,那不是没有实现,你没找到而已。
追问
所谓连接,不是在预编译的时候,把。h全部拷贝到。c里面吗?
追答
不是。编译的时候首先将c文件编译成二进制代码。
连接的时候是以main的那段代码为主干,然后用到什么就把什么拼装进去,最后封成exe
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询