预编译->包括头文件、宏、条件编译等预处理

预编译的基本知识

预编译又称为预处理,是做些代码文本的替换工作。是整个编译过程的最先做的工作。处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

常见的预编译指令有:
(1)#include 指令
该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" “括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"hpp"的头文件。
注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用”"把头文件名扩起,其意义为,先在当前目录下搜索头文件,再在系统默认目录下搜索。
(2)#define指令
该指令有三种用法:

  1. 定义标识:标识有效范围为本翻译单元本指令之后,形如#define XXX,常与#if配合使用;
  2. 定义常数:如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);
  3. 定义"函数":如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数,建议还是用内联函数而不是这种方法提高速度。虽然宏定义函数有这样的弊病,但这种方法的确非常灵活,因为a和b可以是各种数据类型。
  4. 定义"宏函数":如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a,int b){return a>b?a:b;},以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。

(3)#if、#else和#endif指令
这些指令一般这样配合使用:

#if defined(标识)  // 如果定义了标识
…………               // 要执行的指令
#else                    // 否则
…………               // 要执行的指令
#endif                   //结束

预编译的常见问题

问题1:什么是预编译?何时需要预编译?
预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.
何时需要预编译:
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

问题2:写一个“标准”宏,这个宏输入两个参数并返回较小的一个
#define MIN(x, y) ((x)<(y)?(x):(y)) //结尾没有;

问题3:#与##的作用?
#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。
例如:

语句解释
#define STR(arg) #arg则宏STR(hello)展开时为”hello”
#define NAME(y) name_y则宏NAME(1)展开时仍为name_y
#define NAME(y) name_##y则宏NAME(1)展开为name_1
#define DECLARE(name, type) typename##_##type##_type则宏DECLARE(val, int)展开为int val_int_type

问题4:如何避免头文件被重复包含?
例如,为避免头文件my_head.h被重复包含,可在其中使用条件编译:
#ifndef _MY_HEAD_H
#define _MY_HEAD_H /空宏/
/其他语句/
#endif

问题5:头文件的解释和用途?
#include <stdio.h>:是标准输⼊输出函数库头⽂件。头⽂件是扩展名为.h的⽂件,包含了 C 函数声明和宏定义,被多个源⽂件中引⽤共享。有两种类型的头⽂件:程序员编写的头⽂件和编译器⾃带的头⽂件。在程序中要使⽤头⽂件,需要使⽤ C 预处理指令#include来引⽤它。stdio.h头⽂件,它是编译器⾃带的头⽂件。引⽤头⽂件相当于复制头⽂件的内容,但是我们不会直接在源⽂件中复制头⽂件的内容,因为这么做很容易出错,特别在程序是由多个源⽂件组成的时候。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值