前言
关于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
最后的话 :如果大家觉得这篇文章对你们有帮助的话希望你们能够点点关注,你们的关注是我继续写下去的动力,谢谢大家。
答案及解析