第八章 预处理命令

1.1宏定义

   C语言标准允许在程序中用一个标识符来表示一个字符串,成为宏。标识符为宏名,在编译预处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。宏定义是由源程序中的宏命令完成的。宏替换是由预处理程序自动完成。宏分为两种:无参数宏和有参数的宏。

1.1.1无参数宏

无参数宏定义的一般形式为:

[cpp]  view plain  copy
  1. #define 标识符字符串  

“#”代表本行是编译预处理命令。define是宏定义的关键词,标识符是宏名。字符串是宏名所代替的内容,可以是常数,表达式等。

注意:宏定义和其他编译预处理命令不是以分号结尾的。

例:使用无参数宏的程序,输入半径,求圆的半径,求圆的周长和圆的面积。

1.1.2有参数宏

有参数的宏类似于有参数的函数,其定义的一般形式为:

[cpp]  view plain  copy
  1. #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文件包含

文件包含是指把指定源文件的全部内容包括到当前源程序文件中。

文件包含命令的一般形式为:

[cpp]  view plain  copy
  1. #include "文件名"  
  2. 或  
  3. #include <文件名>  

(1)文件包含命令中的文件名即可以用尖括号,也可以用双引号括起来,它们的区别在于查找指定文件的位置不同。

尖括号只在缺省目录里找到指定文件。

双括号则先在源程序文件所在的当前目录里查找指定文件,如果没有找到再到缺省目录里找。

(2)文件包含预处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入该命令行位置取代该命令行,从而指定的文件和当前的源程序文件练成一个源文件。

(3)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。

(4)文件包含允许嵌套,即在一个被包含的一个文件中又可以包含另一个文件。

3.1条件编译

条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理——满足条件时编译某些语句,不满足条件是编译另一些语句。

一般情况下,源程序中所有的行都被编译,有时希望其中一部分内容只在某个条件成立或不成立时才去编译,也就是对一部分内容制定编译的条件,这就是条件编译。

预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。

条件编译分为6种模式:

(1)

[cpp]  view plain  copy
  1. #ifdef 标识符  
  2.     程序段1  
  3. #endif  
它的含义是:如果定义了标识符,就编译程序段1,否则就不编译该程序段。

(2)

[cpp]  view plain  copy
  1. #ifndef 标识符  
  2.      程序段1  
  3. #else  
  4.      程序段2  
  5. #endif  

它的含义是:如果没有定义表示符,就编译程序段1,否则就编译程序段2。

(3)

[cpp]  view plain  copy
  1. #ifndef 标识符  
  2.     程序段1  
  3. #endif  

它的含义是:如果没有定义表示符,则编译程序段1.

(4)

[cpp]  view plain  copy
  1. #ifdef 标识符  
  2.     程序段1  
  3. #else  
  4.     程序段2  
  5. #endif  

它的含义是:如果定义了标识符,就编译程序段1,否则编译程序段2。

(5)

[cpp]  view plain  copy
  1. #if 表达式  
  2.     程序段1  
  3. #endif  

他的含义是:如果表达式成立,则编译程序段1,否则不编译该程序段。

(6)

[cpp]  view plain  copy
  1. #if 表达式  
  2.    程序段1  
  3. #else  
  4.    程序段2  
  5. #endif  
它的含义是:如果表达式成立,就编译程序段1,否则编译程序段2。


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值