标准头文件写法
先了解一下什么是条件编译
//条件编译结构
#if 0或1
//代码块
#endif
那如何使用呢?
#if 1 //值为1则编译框中代码
int main(int argc, const char *argv[])
{
return 0;
}
#endif
#if 0 //值为0则不编译
int main(int argc, const char *argv[])
{
return 0;
}
#endif
好了,了解了这个之后,看一下写好的头文件
#ifndef _FUN_H
#define _FUN_H
int fun(int a);
#endif
让我们来阅读一下这个头文件
#ifndef _FUN_H
这一句可以理解为 if no define 类似于以上条件编译的效果 ,加了一个if的判断
#define _FUN_H
这一句就是简单的宏定义,定义了一个 _FUN_H
简单来说
这两句的效果就是在进入fun.h文件后
如果未定义_FUN_H,就进入文件定义_FUN_H
如果定义了_FUN_C,就直接跳出
执行过程如下:
在同时执行多个文件时
第一个文件执行到#include"fun.h"时,进入fun.h文件,
没有检测到定义了_FUN_N,便进入文件开始运行
第二个文件执行到#include"fun.h"时,进入fun.h文件,
检测到定义了_FUN_N,便直接跳出
第三个文件执行到#include"fun.h"时,进入fun.h文件,
检测到定义了_FUN_N,便直接跳出
如此循环到所有文件运行结束
这样可以避免多个文件每一次运行到
#include"fun.h"
时就对fun.h文件进行一次全部编译,可以节省大量编译时间
头文件的格式如下
#ifndef _FUN_H
#define _FUN_H
//宏定义
define N 10
define M 20
..........
//函数声明
int a();
void b();
........
#endif
拿以下文件举例
文件名4.c,功能是将255的二进制数中第二位到第七位全部置为0
文件名5.c,功能是将1234的千位、百位、十位分别取出并打印
文件名fun.c,头文件,用来声明4.c中的int fun()函数
如下为打印结果:
首先使用 ls 命令查看目录下所有文件
gcc编译文件夹下所有文件
执行编译出的二进制文件
最后再次 ls 查看所有文件
可以看到,在编译之后除了生成的二进制执行文件 ./a.out
还多了一个 fun.h.gch
这个应该就是在执行fun.h文件之后生成的
我们将生成的 a.out 和 fun.h.gch 文件删除
只对4.c和5.c文件编译
可以看到依然会生成 a.out 文件,
但是没有 fun.h.gch 文件了
也就验证了以上猜想
本文使用的代码如下
4.c
#include<stdio.h>
#include"fun.h"
int fun(int argc)
{
int a = 255;
int i,b;
printf("before a=%d\n",a);
for(i=2;i<=7;i++){
a = a &(~ (1<<i));
}
return 0;
}
5.c
#include<stdio.h>
#include"fun.h"
int main(int argc, const char *argv[])
{
int a = 1234;
int b = a /1000;
int c = a %1000 /100;
int d = a %100 /10;
printf("十位是%d\n百位是%d\n千位是%d\n",d,c,b);
fun(a);
return 0;
}
fun.h
#ifndef _FUN_H
#define _FUN_H
int fun(int a);
#endif
最后,感谢对本文的阅读,今后也会分享更多编程遇到的问题和学到的知识
努力,加油!