C语言进阶5:头文件

本文详细介绍了C语言中的头文件,包括头文件的作用、使用方法和编写技巧。头文件主要用来存放函数原型和全局变量声明,通过#include指令在需要的地方引入,确保编译器能正确理解函数调用。文中还提到了头文件的两种包含形式,以及如何处理重复声明的问题,并给出了一组示例代码来说明头文件的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、背景

编写小的程序可以把代码写在一个文件中,当编写大程序中,需要把代码分在多个文件中。
(1)多个源代码文件

(2) main()里面代码太长适当分成几个函数。

(3)一个源代码文件太长适当分成几个文件。

(4)两个独立的源代码文件不能编译成可执行文件。

多个源文件如何相互调用?这里就需要头文件。

2、头文件

2.1 头文件是什么?

(1)#include指令
把函数原型放到一个头文件.h中,在需要调用这个函数的源代码文件.c时,使用#include指令包含这个头文件,使编译器在编译的时候知道函数的原型。

(2)头文件作用
头文件主要用于编译器的编译阶段,告诉编译器在代码中使用了这么一个函数。只是告诉编译器函数的原型,保证调用时参数类型和个数正确。

2.2 头文件怎么用?

在使用和定义函数的地方都要#include头文件。例如我们常用的stdio.h
#include指令不一定要放在.c文件的最前面,但是通常习惯这样做。
#include指令分类
#include指令有两种形式:

(1)#include <>:编译器到指定目录查找,主要用于查找标准库的头文件。
(2)#include “”:编译器先到当前目录查找(.c文件所在目录),如果没有再到指定目录查找。

通过环境变量C_INCLUDE_PATH和编译器命令行参数-I可以指定查找头文件的目录。

#include指令是一个编译预处理指令,和宏一样,在编译之前就处理了。它会把指定的文件原封不动的插入到它所在的地方。

2.3 头文件怎么写?

头文件通常用来存放所有对外公开的函数的原型和全局变量的声明。
通常任何.c文件都有对应同名的.h文件。

2.3.1 声明

(1)常见的声明

函数声明
变量声明
结构声明
宏声明
枚举声明
类型声明

通常声明只能可以放在头文件中,否则,编译器连接会出现重名函数错误。

(2)重复声明

在一个编译单元中,不允许重复声明,尤其是结构体声明。为了防止头文件不被多次#include导致重复声明。

(3)定义与声明

int i;// 变量的定义
extern int i; // 变量的声明

声明是不产生代码的语句。定义是产生代码的语句。

2.3.2 标准头文件结构

避免头文件多次包含,必须使用标准头文件结构。

#ifndef _文件名_H__
#define _文件名_H__

// 声明

#endif

使用条件编译和宏,保证头文件在一个编译单元中只会#include一次。
#pragma once指令也起到相同作用,但是并不是所有编译器支持。

(1)误区:

(a)#include不是用来引入库的
(b)头文件只有函数原型,函数实现在.a(Unix)或者.lib(Windows)中。
(c)现代的C语言编译器会默认引入所有的标准库。

3、示例

(1)student.c

#include "student.h"
char *filename;


void students_print(PStudent students,size_t n){
   
    for(int i=0;i<n;i++){
   
        printf("%s %d %d %f\n",students[i].name,students[i].age,students[i].male,students[i].scores);

    }
}

void students_save(const char *file,const PStudent students,size_t n){
   
    FILE *pfile = fopen(file,"w");
    if(NULL == pfile){
   
      printf("file %s open error!\n",file);
      return;
    }
/*    fprintf(pfile,"%d\n",n);
    for(int i=0;i<n;i++){
       fprintf(pfile,"%s %d %d %f\n",students[i].name,students[i].age,students[i].male,students[i].scores);
    }*/
    fwrite(students,sizeof(Student),n,pfile);
    fclose(pfile);
    pfile=NULL;  
}
size_t students_size(const char*file){
    
    FILE *pfile = fopen(file,"r");
    if(NULL == pfile){
   
      printf("file %s open error!\n",file);
      return 0;
    }
   /* int n;
    fscanf(pfile,"%d",&n);*/
    fseek(pfile,0,SEEK_END);
    int n=ftell(pfile)/sizeof(Student);
    fclose(pfile);
    pfile=NULL;
    return n;
}
void students_append(){
   

}
PStudent students_load(const char 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值