【C语言】文件包含及条件编译

简介: 【C语言】文件包含及条件编译

前言


关于C语言笔记这个系列我已经做了一个多月了,每篇我都付出了很多的时间,如果喜欢的话,可以点个关注,你的支持是我坚持下去的动力。


文件包含


C语言中一个重 要的功能是文件包含。其一般的形式为:#include "文件名"或#include<文件名>。

文件包含的功能是把文件名指定的文件插入到当前位置,从而把指定的文件和后续编写的源代码连成一个源文件。其目的是为了便于程序设计的模块化,在实际编程时可以把一些共有的东西放到一 起,不同人在用到这些共有的部分时只需要包含它即可,既节约了时间,又减少了出错的概率。

*注:文件包含命令允许嵌套使用,但是要特别小心不要重复包含,即一个程序中有名个文件包含了同一个文件。一般来说, 在每个被包含的文件中加入条件编译语句即可。


include"文件名"与include<文件名>的区别


两种文件包含命令的区别在于include<文件名>限定在编译器设定的包含文件目录中去找(一般是系统提供的文件),而include “文件名”则首先在当前源码目录中找(一般是由用户自己编写的),若没有找到才到包含文件目录中去找。


C语言常用头文件



头文件

作用

#include <assert.h>

设定插入点

#include <ctype.h>

字符处理

#include <errno.h>

定义错误码

#include <float.h>

浮点数处理

#include <iso646.h>

对应各种运算符的宏

#include <limits.h>

定义各种数据类型最值的常量

#include <locale.h>

定义本地化C函数

#include <math.h>

定义本地化C函数

#include <setjmp.h>

异常处理支持

#include <signal.h>

信号机制支持

#include <stdarg.h>

不定参数列表支持

#include <stddef.h>

常用常量

#include <stdio.h>

定义输入/输出函数

#include <stdlib.h>

定义杂项函数及内存分配函数

#include <string.h>

字符串处理

#include <time.h>

定义关于时间的函数

#include <wchar.h>

宽字符处理及输入/输出

#include <wctype.h>

宽字符分类


条件编译


条件编译是预处理的重要内容,它可以使程序按照不同的条件去编译不同的部分,生成不同的代码,这种特性在移植和调试程序时非常有用。


条件编译关键字

说明

#if判断

如果后面的判断为真,则执行对应的操作

#elif判断

如果前面的条件为假而该判断为真,则执行对应的操作

#else

如果前面的条件为假,则执行相应的操作

#endif

结束相应的条件编译指令

#ifdef

如果该宏已经定义,则执行相应的操作

#ifndef

如果该宏没有定义,则执行相应的操作


#if-#else-#endif


语句调用格式为:


#if 条件表达式
程序段1
#else 
程序段2
#endif


如果#if后的条件表达式为真,则程序段1被选中,否则程序段2被选中。


#define RESULTO 0//定 义RESULT 为0
int main ()
{
#if RESULT
printf("It's False!\n");
#else
printf("It's True!n");
#endif//标志结束#if
return 0;
}


在该程序中,首先在宏定义时定义RESULT为0,此时在预编译时,#f后的条件为0(是假),所以直接打印It’s False!。如果在宏定义时定义RESULT为1,则程序编译时直接选择编译printf(“It’s Truel!n”);语句,打印出It’s True!。可以看出,通过在程序开头改变宏定义就可以控制整个程序的运行语句。

同样的操作还有:


#if—#elif-#else-#endif
#if—#elif-#else-#endif
#if条件表达式1
程序段1
#elif 条件表达式2
程序段:2
#else
程序段3
#endif


先判断条件表达式1,如果为真,则程序段1被选中编译;如果为假,而条件表达式2的值为真,则程序段2被选中编译;其他情况,即程序段3被选中编译,并且#elif可以根据实际需要多添加几个.


#ifdef-#endif


语句调用格式为:


#ifdef 标识符
程序段
#endif


如果检测到已定义该标识符,则选择执行相应程序段并选中编译:否则,该程段会被忽略。另个相类似的语句为:


#ifndef-#define #endif
其语句调用格式为:
#ifndef 标识符
#define 标识符 替换列表
...//...
#endif


检测程序中是否已经定义了名字为某标识符的宏,如果没有定义该宏,则定义该宏,并选中从#define到#endif之间的程序段:如果已定义该宏,则不再重复定义该符号,且相应程序段不被选中。这两个预编译程序通常用于防止头文件的重复定义。


#include"aaa.h"
#include"bbb.h"
int main()
{
...;
return 0;
}


程序表面看上去没什么问题,但如果aaa.h和bbb.h都包含了同一个头文件x.h,那么x.h在此被包含了两次,因此在编译时编译器会报错。要解决这个问题,可以使用上述的条件编译。如果所有的头文件都像下面这样编写:


#ifndef_ X H
#define_ X H
//(头文件内容)
#endif


那么当头文件x.h第一次被包含时_X_H在此之前没有被定义过,所以它正常运行,并宏定义_X_H:如果_X_H被再次包含,则通过条件编译,它的内容被忽略了。


每日一题:


给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且

m > 1 , m <= n ),每段绳子的长度记为 k[1],…,k[m] 。请问 k[1]k[2]…k[m] 可能的最

大乘积是多少?

输入样例: 8. 输出样例: 18 说明: 8 = 2 +3 +3 , 23*3=18

最后的话 :如果大家觉得这篇文章对你们有帮助的话希望你们能够点点关注,你们的关注是我继续写下去的动力,谢谢大家。


答案及解析


d4ebba7e08ecb112699c51ba6ea55c6e_d21a0cb84c714bd0a885fedc4e6ad193.png

目录
相关文章
|
28天前
|
程序员 编译器 C语言
C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项
本文深入解析C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项,并通过实际案例分析,展示预处理器指令在代码编写与处理中的重要性和灵活性。
61 2
|
1月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
107 3
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
2月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
2月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
2月前
|
C语言
【总结】单片机重点知识总结记录之C语言条件编译(五)
【总结】单片机重点知识总结记录之C语言条件编译(五)
|
2月前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
2月前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
|
3月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。