第5周:程序结构——5.2 编译预处理和宏

1.编译预处理指令

# 开头的是编译预处理指令(其他语言也可使用,include 不是 C 语言关键字)。

它们不是 C 语言的成分,但是 C 语言离不开它们。

#define 用来定义一个宏

#define <名字> <值>     注意没有结尾的分号,因为不是 C 的语句。#define PI 3.14159

名字必须是一个单词,值可以是各种东西。

在 C 语言的编辑器开始编译之前,编译预处理程序(cpp)会把程序中的名字换成值完全的文本替换


2.宏

如果一个宏的值中有其他的宏的名字,也是会被替换的;

如果一个宏的值超过一行,最后一行之前的行末需要加 \

宏的值后面出现的注释不会被当作宏的值的一部分(空格、其他的标点符号都会被当作是宏定义的一部分)。

没有值的宏

#define _DEBUG

这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否被定义过了。

存在编译一部分代码,不存在编译另一部分代码。

预定义的宏

表达特殊东西,让编译器替你插入特殊的值。

__LINE__        源代码文件的行号,当前所在行号

__FILE__        源代码文件的文件名

__DATE__      编译时的日期

__TIME__       编译时的时间

__STDC__      当要求程序严格遵循 ANSIC 标准时,该标识符被赋值为 1 。


3.带参数的宏

#define cube(x) ((x)*(x)*(x))      宏可以带参数

带参数的宏的原则: 一切都要括号

整个值都要括号,参数出现的每个地方都要括号。

可以带多个参数 #define  MIN(a,b)   ((a)>(b)?(b):(a))    也可以组合(嵌套)使用其他宏。

在大型程序的代码中,带参数的宏使用非常普遍,代替函数运行运行效率高。

部分宏会被 inline 函数取代。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容