预处理指令简介

预处理指令(preprocessor directives)是在编译之前由预处理器(preprocessor)处理的特殊指令。也就是说,预处理是编译的“前戏”,不是正式程序的一部分。好比我们要自驾游,得约好同伴吧?得打包行李吧?可能还得提前沐浴更衣、做个拉皮拍个黄瓜啥的,这些都是自驾游的前戏。自驾游时,我们眼脑四肢并用,打火,挂档,给油,看路,瞟导航,这些操作就像我们在敲代码。然后汽车通过电流、拉线、齿轮将我们的操作翻译为电信号和机械传动,这相当于编译。最后发动机点火启动、油门开闭、齿轮啮合、转向、车轮转动就是程序执行了。

预处理指令比较特别,全部以#字符开头。这个符号就是用作和程序代码作区分的,告诉编译器在正式编译之前得先关照一下井边的同志。

预处理器指令的主要类型包括:

1.宏定义(Macro Definition)

#define:定义一个宏。之前咱们讲过,宏表现为“一沙一世界,一叶一菩提”,就是用一小串字符表示一大段代码。你可以把宏想象成一个包装袋。

宏有两种具体应用,可以是一个标识符(不带参数的宏)或是一个宏函数(带参数的宏)。

#undef:取消已定义的宏。

2.文件包含(File Inclusion)

#include:这个指令可以说是喜闻乐见、每日必备。它的实际疗效是将一个源文件的内容包含(插入)到#include指令所在的位置。这允许程序员将代码分布在多个文件中,并在需要时将它们组合起来。每个文件都能单独执行,整合在一起还能搞出更大的阵仗,这就像自驾油我们约玩伴组成个车队一样。

#include指令有两种形式:使用尖括号<>包含标准库头文件,使用双引号""包含用户自定义头文件或特定目录中的文件。

3.条件编译(Conditional Compilation)

像if语句一样(只不过写法不一样),如果满足一定的条件,就将某段代码进行编译,不满足就不编译。这样做是为了根据不同的编译环境或条件(如操作系统类型、编译器选项等)包含或排除特定的代码段。好比我们看天气打包行李,天气不好就要带上雨具。

(1)#if、#elif、#else、#endif:这些指令用于根据条件编译代码。预处理器会检查#if或#elif后面的常量表达式,如果为真(非零),则编译对应的代码段。#else部分(如果有的话)会在前面的条件都不满足时编译。#endif用于结束条件编译块。

(2)#ifdef、#ifndef:这些指令分别用于检查某个宏是否已定义或未定义。如果条件满足,则编译对应的代码段。

4.其他预处理器指令

(1)#error:咱们在编译时总会被提示代码存在这样那样的错误,这些错误是编译器帮我们检测的。如果我们想自己设定某种情况下显示某种错误信息,就要用到#error指令。#error指示编译器在编译时生成一个给定的错误信息,常将它嵌入到条件编译结构中,这样可以基于编译时的条件来决定是否触发这个错误。

(2)#warning:和#error差不多,只不过它输出的不是错误信息,而是警告。

(3)#line:用于将下一行代码的行号、文件名设置为指定的行号、文件名,并且后续行的行号从这个指定行号开始递增。

(4)#pragma:用于向编译器发出指令,有哪些指令由编译器厂商自行定义,因此不同的编译器可能支持不同的 #pragma 指令。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值