文件包含
#include<文件名>//默认到系统的标准路径下寻找要包含的头文件
#includ3"文件名"//默认先到当前位置下 寻找要包含的头文件,如果找到,包含进来,如果没找到,才到系统的标准路径下寻找
说明:
1,include这个预处理命令执行后,用文件中的内容,替换这个命令所在的位置
2使用时 <> //如果是系统相关的头文件用<>
"" //如果自己写的头文件用""
条件编译
语义:
判断标识符是否定义
如果定义了——真 选择程序段1
如果没定义——假 选择程序段2
如下代码是定义后执行结果是yes
#include<stdio.h> #define N int main(void) { #ifdef N printf("yes\n"); #else printf("no\n"); #endif return 0; }以下是与前面逻辑相反的情况(即先判断假,再判断真)
还有下面这种用于控制哪些语句运行
#if 表达式 程序段1 #else 程序段2 #endif#if 1
printf("yes\n");
#endif
执行结果yes
#if 0
printf("yes\n");
#endif
不运行这段打印
#if 后也可以用计算表达式比如#if 1+2
文件包含
实现好的功能 某个模块独立的.c程序提供或者打包成库文件
这时候要把大量的各个模块的.c文件结合起来,一个.c对应有一个头文件
.c——实现具体功能的具体代码比如函数
.h——头文件——放的是自身需要用到的宏类型说明,函数声明//变量的定义不能放到头文件
原因:变量定义 int a=10; 会分配内存;头文件会被多次 #include 粘贴到不同.c里,就造成【同一个变量,多次分配内存】,链接时报重复定义错误
#ifndef 头文件名 // 大写,前后下划线
#define 头文件名
1,2两步过程是为了防止重复包含的问题,如果遇到
#include"stdio.h"
#include"stdio.h"
两次头文件多次包含了文件可能会报错,这个能阻止多次使用
#ifndef = if not defined,翻译:如果没有被定义
1. 第一次 #include "getDays.h"
检查: _GETDAYS_H_ 有没有被定义?
如果没有就执行 #define _GETDAYS_H_ ,把这个宏标记定义上
往下执行,把里面的函数声明加载进来
2. 第二次又 #include "getDays.h"
检查: _GETDAYS_H_ 已经定义过了
#ifndef 条件不成立,直接跳过中间全部代码
作用:防止同一个头文件被重复粘贴,避免重复声明报错,保护声明的内容只出现一次
举一个实际例子找最大值最小值
#include<stdio.h> //求最大值 int getMax(int x, int y) { if(x > y) return x; else return y; } //求最小值 int getMin(int x, int y) { if(x < y) return x; else return y; } int main(void) { int a,b; printf("请输入两个整数:"); scanf("%d%d", &a, &b); int max = getMax(a,b); int min = getMin(a,b); printf("最大值=%d,最小值=%d\n", max, min); return 0; }以上是一个单独的.c的找最大值最小值的代码
以下是找最大值的.h文件,
#ifndef __MAX_H__ //如果先前没有定义过,就定义这个标识符,包含声明内容 #define __MAX_H__ //目的是防止后续重复使用这个头文件会重复声明 int getMax(int x,int y); //声明函数用于后续调用知道有这个函数在 #endif //结束以下是找最大值的.c文件
#include "max.h" int getMax(int x, int y) { return x>y ? x:y; }以下是找最小值的.h文件
#ifndef __MIN_H__ #define __MIN_H__ int getMin(int x,int y); #endif以下是找最小值的.c文件
#include "min.h" int getMin(int x, int y) { return x<y ? x:y; }以下是主函数
#include<stdio.h> //调用标准库 #include "max.h" //调用获取最大值函数的声明 #include "min.h" //调用获取最小值函数的声明 int main(void) { int a=12,b=7; printf("max=%d\n", getMax(a,b)); printf("min=%d\n", getMin(a,b)); return 0; }情况1:全部写在同一个 .c 文件
两种写法二选一:
1. 函数写在main前面:编译器从上往下读,提前看到函数实现,main直接调用,不用单独写声明。
2. 函数写在main后面:必须在main之前,写函数声明,告诉编译器这个函数的返回值、参数。
情况2:分模块,多个.c
函数的实现代码,放到另一个 .c(max.c)。
但是main.c不知道这个函数,依然需要函数声明。
方案A:直接在main.c手写一行 int getMax(int x,int y);
缺点:项目大了,几十个函数,每个文件都复制粘贴声明;一旦函数参数改了,所有地方全部手动改,极易漏改、出错。
方案B:把这一堆声明统一放进 .h头文件
所有需要调用这个模块的 .c ,只写一句 #include "max.h" 。
只要修改头文件里的声明,所有包含这个头的文件自动同步,统一管理。