【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

目录
相关文章
|
16天前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
1月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
37 15
|
1月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
1月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
1月前
|
存储 C语言
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
|
2月前
|
Linux C语言 Windows
C语言文件编程-Linux环境下运行
本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用C标准库函数实现文件复制,另一个则使用Linux系统调用完成相同任务。
34 2
|
3月前
|
编译器 C语言
C语言编译详解:GCC分步编译与一次编译多个文件
C语言编译详解:GCC分步编译与一次编译多个文件
249 2
|
3月前
|
存储 C语言
C语言文件读写详解
C语言文件读写详解
|
3月前
|
Unix 编译器 C语言
C语言中的条件编译:探索编译时的决策
C语言中的条件编译:探索编译时的决策
|
3月前
|
存储 编译器 数据库
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据