C语言的预处理、宏、文件包含
C语言介绍
C的开发流程
C 是一种编译型语言,所谓编译型语言是指在程序运行之前,需要先经过编译和链接过程:
编辑源文件(获得源文件)
编译源文件(获得目标文件)
链接目标文件及库文件(获得可执行文件)
运行程序(获得运行结果)
对变量定义的理解
比如: int i;
定义一个变量的过程实际上是向内存申请一个符合这个变量的数据类型的存储单元的过程,因此可以认为变量的实质就是内存中某一个单元的格式符,对这个格式符的引用就相当于对相应的内存单元的读取操作
字符数组和字符串
用来存放字符型数据的数组称为字符数组。字符数组的每个数组元素存放一个字符。作为数组的其中一个类型,字符数组的定义、初始化和易用等规则和一般的数组一样
字符串在C 语言中被当做字符数组来处理(其他比如java就是有单独一个String 类型)
需要注意的是:C 语言中字符串的末尾都隐含一个'\0' 字符,因此长度为 n 的字符串在内存中占用 n+1个字节
预处理
预处理是C 语言的一个重要的功能,它是由预处理程序负责完成的。当对一个源文件进行编译时,系统将自动调用于处理程序对文件中的预处理部分进行处理,完成之后才进入对源文件的编译。C语言中提供的预处理功能包括宏定义、文件包含以及条件编译等
设计和编写源程序的时候有效的使用预处理可以提高项目的可移植性……
宏定义
C语言源程序中,使用一个标识符来表示一个字符串,称为宏。程序编译之前,预处理程序会将源程序中的标识符替换为字符串,这个过程称为宏展开
不带参数的宏定义,比如
//#define 宏名 字符串#define PI 3.1415926....//就可以使用这个宏c=2*PI*r;...
带参数的宏定义
//#define 宏名(形式参数) 字符串#define MAX(a,b) (a>b)?a:b
注意带参数的宏定义,宏名 和 (形式参数)之间是不能有空格的,否则会在展开时出错,假如有空格,就会在调用MAX(a,b) 的时候被替换(a,b) (a>b)?a:b (a,b),所以完全不是我预想的效果。
宏调用对的过程,其实只是一个符号的替换(在编译之前),和函数是完全不同的
文件包含
文件包含是将指定文件的内容插入到当前文件之中。使用文件包含,可以减少程序设计人员的重复劳动,提高程序的开发效率
#include<文件名>
在系统设定的目录中进行查找,一般是通过环境变量来进行设定,一般用这种形式包含系统的头文件
#include"文件名"
在当前的路径下进行查找,如果没有找到再去系统指定的目录下进行查找,一般用这种形式包含用户自定义的头文件
条件编译
C语言中引入条件编译主要是为了在不同的情况下控制不同的代码段被编译,这样可以将针对不同情况的代码编写在同一个程序文件中,从而方便程序的维护和移植。同时,使用条件编译可以使目标程序变小,运行速度变快
#if、#else、#elif、#endif命令
#if 常量表达式 代码段1#else 代码段2#endif
如果常量表达式的值为真(非0),编译代码段1,否则编译代码段2
#ifdef、#else、#ifndef、#endif命令
#ifdef 宏名 代码段1#else 代码段2#endif
如果宏名在前面已经定义过,编译代码段1,否则编译代码段2