打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
UC头条:[C 知识点]预处理命令
userphoto

2023.06.20 山西

关注

预处理命令

预处理概述

预处理是C++的一个重要功能,预处理由预处理程序负责完成。

预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。

当对一个源文件进行编译时,系统把自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

C++提供了多种预处理功能,例如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,还有就是利于模块化程序设计。

#include其实就是一个预处理命令预处理,主要是处理以#开头的命令。预处理命令要放在所有函数之外,而且一般都放在源文件的前面。

常用预处理指令

//文件包含类#include包含一个源代码文件,头文件//宏定义类#define定义宏#undef取消已定义的宏//条件编译类#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果#if条件不为真,当前条件为真,则编译下面代码#endif结束#if...到#else条件编译块

宏定义

C++源程序中允许用一个标识符来表示一个字符串,称为“宏”。

被定义为宏的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏替换或宏展开。

宏定义是由源程序中的宏定义命令完成的。

宏替换是由预处理程序自动完成的。在C语言中,宏定义分为有参数和无参数两种。

无参数宏定义

//语法#defineidentifyexpression#define定义宏使用的关键字。identify宏的标识符,也就是宏名。expression该宏所代表的表达式或者常量值。//案例:#definePI3.14//定义了一个宏PI,其代表的常量值为3.14,以后,我们需要使用3.14的地方,可以直接使用PI来代替。

案例

利用宏定义PI,输入半径r,完成求圆面积的代码。#definePI3.1415926doubler;cin>>r;cout<<><>< p=''><><>

带参数宏定义

//语法#defineidentify(paramlist)expression#define定义宏使用的关键字。identify宏的标识符,也就是宏名。paramlist宏的参数列表。expression该宏所代表的表达式或者常量值。

案例

#defineINC(x)x++//定义了一个宏INC,该宏接受一个参数x,该宏实现的功能是将当前x的值自增//案例1#defineINC(v)v++#defineDEC(v)v--intnum=100;cout<<“num=“<<><><><><><><>

在使用宏参数时,建议将所有的参数都是要括起来。

像函数参数一样,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。

宏函数

C++中的宏函数,其实就是带参数的宏。

C++的宏函数跟普通函数类似,只是宏函数的参数没有类型。

案例

利用宏函数,实现判断字符是否是十进制数字!#defineDIGIT(c)((c)>=’0’&&(c)<='9’)charch1='a’;charch2='2’;intd1=DIGIT(ch1);intd2=DIGIT(ch2);cout<<><><='' p=''>

取消宏定义

定义了宏或者宏函数之后,如果不用了,可以使用undef取消定义宏和宏函数。

//语法#undefMACRO_NAME

案例

#definePI3.14intmain{cout<<'PI='<<><><><><='' p=''><><><>

条件编译

有些时候,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译功能可按不同的条件去编译不同的程序部分,从而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。

在C++中,一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。

条件编译作用

1.屏蔽跨平台差异

在大规模开发过程中,特别是跨平台和系统的软件里,可以在编译时通过条件编译设置编译环境。

2.包含程序功能模块

可以使用#ifdef实现包含程序的不同的功能模块。

3.开关调试信息

调试程序时,常常希望输出一些所需的信息以便追踪程序的运行。而在调试完成后不再输出这些信息,可以通过条件编译控制。

4.防止头文件重复包含

头文件(.h)可以被头文件或CPP文件包含。由于头文件包含可以嵌套,CPP文件就有可能多次包含同一个头文件;或者不同的CPP文件都包含同一个头文件,编译时就可能出现重复包含(重复定义)的问题。

#ifdef

C++的#ifdef用于判断,如果一个标识符已被#define命令定义过,那么就编译该段代码,否则不编译。同时,#ifdef还可以配合#else一起使用。

//语法#ifdefidentitycode1#endif//如果标识符identity被定义过了,那么就编译代码code1,否则就不编译。//语法#ifdefidentitycode1#elsecode2#endif//如果标识符identity被定义过了,那么就编译代码code1,否则就编译代码code2。

案例

//案例1#includeusingnamespacestd;intmain{cout<<'测试条件编译'<<><>usingnamespacestd;intmain{cout<<'条件编译测试2'<<><><><><>< p=''><><><><><><>

#ifndef

#ifndef正好和#ifdef反过来,用于判断,如果一个标识符没有被#define命令定义过,那么就编译该段代码,否则不编译。就是ifnotdefine的意思。

//语法#ifndefidentitycode1#endif//如果标识符identity未被定义过,那么就编译代码code1,否则就不编译。//语法#ifndefidentitycode1#elsecode2#endif//#ifndef也可以配合#else一起使用,这里说明,如果标识符identity未被定义过,那么就编译代码code1,否则就编译代码code2。

案例

//案例1#includeusingnamespacestd;intmain{cout<<'条件编译测试3'<<><>usingnamespacestd;intmain{cout<<'条件编译测试4'<<><><><><>< p=''><><><><><><>

#if

C++的#if后面可以接常量表达式,如果常量表达式的值为真(非0),则对一段程序进行编译,否则对另一段程序进行编译。因此可使程序在不同条件下,完成不同的功能。

//语法1#ifexpressioncode1#endif//语法2#ifexpressioncode1#elsecode2#endif

案例

//案例1#includeusingnamespacestd;intmain{cout<<'条件编译测试5'<<><>usingnamespacestd;intmain{cout<<'条件编译测试5'<<><><><><>< p=''><><><><><><>

#elif

#elif可以跟在#if,#ifdef#ifndef的后面,但#else只能跟在最后面,用法和基本的条件语句类似。

案例

#includeusingnamespacestd;intmain{cout<<'条件编译测试'<<><><><><>< p=''><><><><><>

#error

#error用于在编译期间给出一个错误信息,并终止程序的编译。同时,#error后面的错误信息不需要使用双引号。

//语法#errorerrormessage

案例

#includeusingnamespacestd;intmain{cout<<'条件编译测试'<

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言中的宏定义
C语言中的预处理详解
C语言学习教程第九章-预处理(4)
预处理概述
C语言 条件编译详解
C语言预处理命令详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服