Linux C程序 预处理命令
第八章 预处理命令
1.1宏定义
C语言标准允许在程序中用一个标识符来表示一个字符串,成为宏。标识符为宏名,在编译预处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。宏定义是由源程序中的宏命令完成的。宏替换是由预处理程序自动完成。宏分为两种:无参数宏和有参数的宏。
1.1.1无参数宏
无参数宏定义的一般形式为:
#define 标识符字符串
“#”代表本行是编译预处理命令。define是宏定义的关键词,标识符是宏名。字符串是宏名所代替的内容,可以是常数,表达式等。
注意:宏定义和其他编译预处理命令不是以分号结尾的。
例:使用无参数宏的程序,输入半径,求圆的半径,求圆的周长和圆的面积。
1.1.2有参数宏
有参数的宏类似于有参数的函数,其定义的一般形式为:
#define 标识符(形参表)字符串
如果有多个形参,像函数参数一样以逗号隔开。在程序中使用有参数宏的形式是:
标识符(实参表)
例:演示参数的实现方法
注意:有参数宏只是符号替换,不存在值传递。
1.1.3预处理判断
(1)
如果上面没有定义_A_,那么使用_A_(5.1415926),如果上面定义了_A_,使用_A_(3.1415926)。
(2)
如果上面定义了_A_,使用_B_,输出_B_。
1.1.4知识点:宏定义与函数的区别。
(1)宏定义只是对字符串进行简单替换,而函数调用则是按程序的含义来替换形式参数。
(2)宏定义只能用于简单的单行语句替换,而函数可用于负责运算。
(3)宏定义只占用编译时间,不占用运行时间,执行速度快,而函数调用,参数的传递等,都要占用内存开销。
(4)宏定义在编译时展开,多次使用会让源程序增大,而函数调用不管多少次总占用相同的源程序空间。
(5)宏的作用范围从定义点开始,到程序文件的末尾或使用命令#undef取消定义之前。
(6)有参数的宏的形式参数不是变量,不分配内存空间,无需说明数据类型。而函数的形式参数是变量,需要分配内存空间,在函数定义时要指明参数的数据类型。
注:undef 是终止宏定义的特定字,其作用是从该命令开始,该表示符(宏名)不再代表相应字符序列,即该标识符的作用范围到此处结束。
2.1文件包含
文件包含是指把指定源文件的全部内容包括到当前源程序文件中。
文件包含命令的一般形式为:
#include "文件名"
或
#include <文件名>
(1)文件包含命令中的文件名即可以用尖括号,也可以用双引号括起来,它们的区别在于查找指定文件的位置不同。
尖括号只在缺省目录里找到指定文件。
双括号则先在源程序文件所在的当前目录里查找指定文件,如果没有找到再到缺省目录里找。
(2)文件包含预处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入该命令行位置取代该命令行,从而指定的文件和当前的源程序文件练成一个源文件。
(3)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。
(4)文件包含允许嵌套,即在一个被包含的一个文件中又可以包含另一个文件。
3.1条件编译
条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理——满足条件时编译某些语句,不满足条件是编译另一些语句。
一般情况下,源程序中所有的行都被编译,有时希望其中一部分内容只在某个条件成立或不成立时才去编译,也就是对一部分内容制定编译的条件,这就是条件编译。
预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。
条件编译分为6种模式:
(1)
#ifdef 标识符
程序段1
#endif
它的含义是:如果定义了标识符,就编译程序段1,否则就不编译该程序段。
(2)
#ifndef 标识符
程序段1
#else
程序段2
#endif
它的含义是:如果没有定义表示符,就编译程序段1,否则就编译程序段2。
(3)
#ifndef 标识符
程序段1
#endif
它的含义是:如果没有定义表示符,则编译程序段1.
(4)
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的含义是:如果定义了标识符,就编译程序段1,否则编译程序段2。
(5)
#if 表达式
程序段1
#endif
他的含义是:如果表达式成立,则编译程序段1,否则不编译该程序段。
(6)
#if 表达式
程序段1
#else
程序段2
#endif
它的含义是:如果表达式成立,就编译程序段1,否则编译程序段2。上一篇: 《汇编语言》(第三版)王爽第八章实验7个人方法记录
下一篇: 青枣的好处,一起来看看!