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