预处理阶段:宏定义与条件编译

预处理阶段:宏定义与条件编译

 

预处理编程

预处理阶段编程的操作目标是“源码”,用各种指令控制预处理器,把源码改造成另一种形式,就像是捏橡皮泥一样。C++ 语言有近百个关键字,预处理指令只有十来个,实在是少得可怜。而且,常用的也就是 #include、#define、#if,所以很容易掌握。首先,预处理指令都以符号“#”开头,虽然都在一个源文件里,但它不属于 C++ 语言,它走的是预处理器,不受 C++ 语法规则的约束。

一般来说,预处理指令不应该受 C++ 代码缩进层次的影响,不管是在函数、类里,还是在 if、for 等语句里,永远是顶格写。另外,单独的一个“#”也是一个预处理指令,叫“空指令”,可以当作特别的预处理空行。而“#”与后面的指令之间也可以有空格,从而实现缩进,方便排版。


#                              // 预处理空行
#if __linux__                  // 预处理检查宏是否存在
#   define HAS_LINUX    1      // 宏定义,有缩进
#endif                         // 预处理条件语句结束
#                              // 预处理空行

预处理程序也有它的特殊性,暂时没有办法调试,不过可以让 GCC 使用“-E”选项,略过后面的编译链接,只输出预处理后的源码,比如:


g++ test03.cpp -E -o a.cxx    #输出预处理后的源码

先来说说最常用的预处理指令“#include”,它的作用是“包含文件”。注意,不是“包含头文件”,而是可以包含任意的文件。


#include "a.out"      // 完全合法的预处理包含指令,你可以试试

包含文件(#include)

使用“#include”可以把源码、普通文本,甚至是图片、音频、视频都引进来。当然,出现无法处理的错误就是另外一回事了。“#include”其实是非常“弱”的,不做什么检查,就是“死脑筋”把数据合并进源文件。所以,在写头文件的时候,为了防止代码被重复包含,通常要加上“Include Guard”,也就是用“#ifndef/#define/#endif”来保护整个头文件,像下面这样:


#ifndef _XXX_H_INCLUDED_
#define _XXX_H_INCLUDED_

...    // 头文件内容

#endif //
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值