问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++预处理的C++预处理指令

发布网友 发布时间:2022-04-29 16:00

我来回答

1个回答

热心网友 时间:2022-04-12 21:17

一、预处理的由来:
在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预
处理就是其中的一个。C++从C语言那里把C语言预处理器继承过来(C语言预处理器,被Bj
arne博士简称为Cpp,不知道是不是C Program Preprocessor的简称)。
二、常见的预处理功能:
预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见
的预处理有:文件包含,条件编译、布局控制和宏替换4种。
文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正
文。
条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进
行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复
包含的功能。
布局控制:#progma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序
提供非常规的控制流信息。
宏替换: #define,这是最常见的用法,它可以定义符号常量、函数功能、重新命名
、字符串的拼接等各种功能。
三、预处理指令:
预处理指令的格式如下:
# directive tokens
#符号应该是这一行的第一个非空字符,一般我们把它放在起始位置。如果指令一行放
不下,可以通过\进行控制,例如:
#define Error if(error) exit(1) 等价于
#define Error \
if(error) exit(1)
不过我们为了美化起见,一般都不怎么这么用,更常见的方式如下:
# ifdef __BORLANDC__
if_true<(is_convertible<Value,named_template_param_base>::value)>:
:
template then<make_named_arg, make_key_value>::type Make;
# else
enum { is_named = is_named_parameter<Value>::value };
typedef typename if_true<(is_named)>::template
then<make_named_arg, make_key_value>::type Make;
# endif
下面我们看一下常见的预处理指令:
#define 宏定义
#undef 未定义宏
#include 文本包含
#ifdef 如果宏被定义就进行编译
#ifndef 如果宏未被定义就进行编译
#endif 结束编译块的控制
#if 表达式非零就对代码进行编译
#else 作为其他预处理的剩余选项进行编译
#elif 这是一种#else和#if的组合选项
#line 改变当前的行数和文件名称
#error 输出一个错误信息
#pragma 为编译程序提供非常规的控制流信息
下面我们对这些预处理进行一一的说明,考虑到宏的重要性和繁琐性,我们把它放到
最后讲。
四、文件包含指令:
这种预处理使用方式是最为常见的,平时我们编写程序都会用到,最常见的用法是:
#include <iostream> //标准库头文件
#include <iostream.h> //旧式的标准库头文件
#include IO.h //用户自定义的头文件
#include ../file.h //UNIX下的父目录下的头文件
#include /usr/local/file.h //UNIX下的完整路径
#include ..\file.h //Dos下的父目录下的头文件
#include \usr\local\file.h //Dos下的完整路径
这里面有2个地方要注意:
1、我们用<iostream>还是<iostream.h>?
我们主张使用<iostream>,而不是<iostream.h>,为什么呢?我想你可能还记得我
曾经给出过几点理由,这里我大致的说一下:
首先,.h格式的头文件早在98年9月份就被标准委员会抛弃了,我们应该紧跟标准
,以适合时代的发展。
其次,iostream.h只支持窄字符集,iostream则支持窄/宽字符集。
还有,标准对iostream作了很多的改动,接口和实现都有了变化。
最后,iostream组件全部放入namespace std中,防止了名字污染。
2、<io.h>和io.h的区别?
其实他们唯一的区别就是搜索路径不同:
对于#include <io.h> ,编译器从标准库路径开始搜索
对于#include io.h ,编译器从用户的工作路径开始搜索
五、编译控制指令:
这些指令的主要目的是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达
到版本控制、防止对文件重复包含的功能。
使用格式,如下:
1、
#ifdef identifier
your code
#endif
如果identifier为一个定义了的符号,your code就会被编译,否则剔除
2、
#ifndef identifier
your code
#endif
如果identifier为一个未定义的符号,your code就会被编译,否则剔除
3、
#if expression
your code
#endif
如果expression非零,your code就会被编译,否则剔除
4、
#ifdef identifier
your code1
#else
your code2
#endif
如果identifier为一个定义了的符号,your code1就会被编译,否则your code2就
会被编译
5、
#if expressin1
your code1
#elif expression2
your code2
#else
your code3
#enif
如果epression1非零,就编译your code1,否则,如果expression2非零,就编译y
our code2,否则,就编译your code3

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请帮忙查iphone4手机的序列号dx3hnchpdp0n DX3J481PDP0N帮忙查一下 是真的吗 我不会查 大神们是翻新的? 苹果4激活日期查询 猫猫一直发情怎么办呢 如何帮助猫咪度过发情期呢? 本科英语都要过4级吗 车子中间的踏板是什么 高考400分能考哪些军事类二本 联通3g双卡双待智能导航手机 ...可以一个卡装移动2g的卡,专打电话,一个卡装联通3g流量卡吗 幼儿园怎么通知家长明天上课 文件包含命令、编译预处理命令、C预处理器指令三者有什么区别吗?_百度... 幼儿园通知家长自己带餐盘怎么通知 错误2 error C1021: 无效的预处理器命令&quot;include &quot; c++提供的预处理命令主要有以下3种 幼儿园老师怎么通知家长有没有接触外来人员? c程序在执行过程中对预处理命令进行处理这一说法为什么是错误的 腾讯微云怎么解压文件 在C#中,预处理器指令#region(地区,范围)和#endregion 的作用是??_百度... C# 里面的 #region 是什么意思? C#中的预处理器命令是指什么?有什么作用,能干什么? 怎样制作教学课件 什么叫驻厂?具体是做什么的啊? 劳务员主要工作是干什么的? 人力中介驻厂代表是什么样子的 傲娇受现代都市耽美文 驻厂招聘是什么定义啊? 劳务员岗位职责是什么? 求傲娇美人受和腹黑攻的耽美文,一定要是美受!!!!!!最好多说几本,急急急,最近书荒啊 校园耽美,要傲娇受傲娇受傲娇受,重要的事情说三遍,美攻美受求推荐,记得给个简介。 预处理器指令后有意外标记 - 应输入换行符 #include 有什么用 微云怎么上传不了压缩包 预处理的程序设计的预处理 优酷看不了视频怎么办 用预处理指令#define声明一个常数,用以表明1年中有多少秒 闲鱼的闲置宝贝怎么不让它同步到淘宝店铺? C++ 能否使用 预处理器指令 选择语言标准 手机号和都不用了,如何找回健康通行码? C中预处理命令 #error 用法是怎么样的 请举例. 在闲鱼上发布东西,为什么我的还会在淘宝店铺里出现,有什么办法不让它显示,为什么有的人说不会显示? 预处理器指令后有意外标记 - 应输入换行符 vc++问题 闲鱼卖的限制物品如何不出现在手机淘宝店铺里? Photoshop怎么绘制粉色大白图标 手机号和都不用了,如何找回健康通行码? 粉色大白墙壁如何补 有卖装修用的粉色大白膏吗 白色墙壁重新粉刷成粉红色,应该怎么做? 干煸豆角做法视频 如何制作干煸豆角 如何能够辨别铁观音茶的好坏?