首页
登录 | 注册

编译预处理

编译预处理是指在编译程序对C源程序进行编译之前,先对程序正文进行预处理,分为宏定义#define#undef文件包含#include及条件编译#if#else#ifdef#ifndef#elif#endif

101宏定义

宏定义是:通过#define指令来将一个标识符与一个字符串关联起来,即用标识符来代替该字符串,这个字符串称为宏名。

宏定义指令:#define,终止宏定义指令#undef

分为:带参数宏定义和不带参数宏定义

1011 不带参数的宏

宏定义格式:#define 标识符 替换字符串

说明:

1、宏定义一般放在程序开头,用来定义符号常量;习惯上将“标识符”大写,称为宏名;宏定义是指令,不是语句,所以后面不能有分号。

2、编译预处理将程序中“标识符”替换成后面“替换字符串”。

宏定义的直接应用之一是在表示数组大小时,能使其大小易于修改。

[课件展示命令格式及相关例子]

例:#define TRUE 1          /*预编译将程序中TRUE 换成1*/

#define FALSE 0         /*预编译将程序中FALSE 换成0*/

#define MAXSIZE 80     /*修改80,可改变数组大小*/

…..

char buffer[MAXSIZE]

删除宏格式:#undef 宏名

例:#define MAXSIZE 80

…..

#undef MAXSIZE         /* MAXSIZE以后不再有效 */

1012带参数的宏

1、带参数的宏定义格式:#define 宏名(形式参数列表) 替换字符串

说明:形参列表用逗号分隔。

2、带参数的宏调用格式:宏名(实际参数列表)

说明:预编译将实参代替形参,再替换(与简单函数类似)。

10-1


1、宏定义是预编译时处理,而函数调用是程序运行时进行。

2、宏定义实参代替形参是简单的字符串替换,函数调用是将实参值或地址传递给形参

3、实参若为表达式,函数调用只求值一次,宏定义替换时求值可能不止一次

  通过例10-2、例10-3说明区别3 [课件展示区别3]

4、函数只有一个返回值,而宏可有多个返回值

  10-4[课件展示说明区别4]

带参数的宏删除格式:#undef 宏名

例:#define ABS(x) ((x)<0?-(x):(x))

    ….

    #undef ABS

102文件包含

作用:将指定的文件内容包含到当前文件中,在程序开头使用指令#include

格式一:#include <文件名>

说明:包含系统目录(如:INCLUDE)中指定的文件(一般用于包含系统提供的头文件)。

格式二:#include “文件名

说明:包含当前目录或系统目录中指定的文件(先在当前目录中找,一般用于包含自定义的头文件)。

注意两种格式的区别。

例:#include

#include “mydef.h”

注意:#include一般用来包含“.h”为后缀的头文件,预编译将此文件插入到当前位置。多个文件包含需用多个#include指令。

例:#include

#include

#include “mydef.h”

…..

文件包含指令可以嵌套使用(一个被包含文件中,可以包含另一个被包含文件)。

例:p143[课件展示]

103条件编译

条件编译概念:按照不同的条件去编译程序不同的部分,从而生成不同的目标代码,以实现程序的不同功能。

条件编译的用途:可构造多种条件下运行的程序,提高程序的通用性和可移移植性,                便用程序的调式与纠错,大型C程序,经常使用条件编译。

与条件编译相关预处理指令有:#if#else#ifdef#ifndef#elif#endif

条件编译指令使用形式:

1#if的使用方法[课件展示命令的两种形式]

形式(1):#if 常量表达式

                  程序段1

          #else               /*此部分可以没有*/

                  程序段2

          #endif

功能:常量表达式为真,编译程序段1,否则编译程序段2

10-5[课件展示]

形式(2):#if 常量表达式1

                  程序段1

          #elif常量表达式 2        /*可有多个#elif */

                  程序段2

          #else             

                  程序段3

          #endif

功能:常量表达式1为真,编译程序段1;若常量表达式1为假,而常量表达式2为真,编译程序段2;其它,编译程序段3

2#ifdef的使用方法

格式:#ifdef  标识符

                程序段1

      #else               /*此部分可以没有*/

                程序段2

      #endif

功能:若标识符已被定义(通常用#define,则编译程序段1,否则编译程序段2

10-6[课件展示]

3#ifndef的使用方法

格式:#ifndef  标识符

                程序段1

      #else               /*此部分可以没有*/

                程序段2

      #endif

功能:若标识符未被定义(通常用#define,则编译程序段1,否则编译程序段2

10-7[课件展示]

p148[课件展示]

 

小结:

本节讲了三种预编译处理:

宏定义是用标识符来代替该字符串,这个字符串称为宏名;

文件包含是将指定的文件内容包含到当前文件中;

条件编译是按照不同的条件去编译程序不同的部分,从而生成不同的目标代码,以实现程序的不同功能;

要掌握它们在程序中作用,正确的使用它们来增加程序的可读性、灵活性和通用性,减少出错机率。


相关文章

  • --prefix= 指向安装目录 --sbin-path 指向(执行)程序文件(nginx) --conf-path= 指向配置文件(nginx.conf) --error-log-path= 指向错误日志目录 --pid-path= 指向 ...
  • 在网上下载net-snmp5.7.3版本的源码,将其解压到Linux系统之中. gcc编译net-snmp 进入解压的net-snmp源码根目录下,输入以下命令: ./configure --prefix=/usr/local/net-sn ...
  • 1. 下载openwrt源代码 git clone https://git.openwrt.org/openwrt/openwrt.git enzo@t430s:~/openwrt/openwrt$ git branch -a * mast ...
  • FFmpeg使用手册 - FFmpeg 的编译安装-T
    FFMpeg在官方网站中提供了已经编译好的可执行文件,用FFmpeg的人很多,因为FFmpeg是开源的,并且可以自己DIY,而且很强大,所以,FFmpeg还有一个优势就是开源.而在使用Linux时,无论是用ubuntu或者redhat,如果 ...
  • 新RTMFP流媒体服务器 MonaServer 源码编译安装-T
    MonaServer 源码编译安装   MonaServer 是Cumulus这个项目衍生出来的新项目,前身Cumulus在github中注明了Cumulus已经比较老,希望使用最新的RTMFP的server的话可以尝试MonaServer ...
  • 一.编译运行    Erlang程序运行主要有三种方式:    1.在Erlang shell中编译运行:        c(hello).        hello:start().    2.在命令提示符下编译运行:        er ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号