《C++新经典》第8章 编译预处理

92 篇文章 18 订阅
15 篇文章 2 订阅


可复用代码,实现相对独立和短小的功能。

8.1 宏定义

编译阶段工作:

  1. 预处理,预先处理特殊代码|命令(特殊能力,特殊功能)。
  2. 编译,词法分析、语法分析、目标代码生成、优化等
  3. 汇编,产生.obj文件

C语言三种预处理功能:宏定义、文件包含、条件编译。通过在源代码文件写入代码(特殊代码,“#”开头)实现。

8.1.1 无参宏定义

指定宏名(标识符)代替一串内容。

  • 一般形式:
#define 宏名 被替换的内容
#define PI 3.1415926 
//宏名一般大写,非语句,末尾无分号
//宏名有效范围是#define之后到本文件结束


//#define就是宏定义命令,实现简单名字(宏名)代替一段内容,预编译时宏名替换指定内容称为宏展开或宏替换
//#define增加代码修改方便性
  • #undef终止宏定义的作用域
#define PI 3.1415926 
int main() {
	printf("%f", PI * 2);
	return 0;
}

#undef PI
void func() {
	printf("%f", PI); //报错
}
  • 宏可以层层置换
#define PI 3.1415926 
#define DPI 2 * PI
#define DPICPI PI * DPI
  • 字符串内字符不进行宏替换
#define PI 3.1415926 
char tmp[100] = "PIPI";
printf("%s\n", tmp);

8.1.2 带参宏定义

进行内容替换和参数替换。

  • 一般形式:
#define 宏名(参数表) 被替换的内容
#define S(a,b) a*b
int Area = S(3,2);


#define PI 3.1415926 
#define S(r) PI * r * r
float area = S(3.6);
  • 参数外面加括号
#define PI 3.1415926 

#define S(r) PI * r * r
S(5+1)被替换为
3.1415926 * 5+1 * 5+1

#define S(r) ( (PI) * (r) * (r) )
S(5+1)被替换为
( (3.1415926) * (5+1) * (5+1) )

  • 宏定义换行用“\”拼接
#define MACROTEST do {\
	printf("test\n");\
}

.

8.2 文件包含和条件编译

8.2.1 文件包含

将另外的文件包含到本文件中。

#include "文件名"
  • <>系统目录查找
  • ""优先当前目录,然后系统目录查找

8.2.2 条件编译

对部分内容满足一定条件才进行编译。

#ifdef 标识符
	程序段1(一堆代码)
#else
	程序段2(一堆代码)
#endif


#ifdef 标识符
	程序段1(一堆代码)
#endif

#define DEBUG
//#define DEBUG 1
#ifdef DEBUG 
	printf("debug\n")
#endif
#ifndef 标识符
	程序段1(一堆代码)
#else
	程序段2(一堆代码)
#endif


#ifndef 标识符
	程序段1(一堆代码)
#endif

//#define DEBUG
//#define DEBUG 1
#ifndef DEBUG 
	printf("debug\n")
#endif
#if 表达式 //真(非0)执行
	程序段1(一堆代码)
#else
	程序段2(一堆代码)
#endif

#if 表达式1
	程序段1(一堆代码)
#elif 表达式2
	程序段2(一堆代码)
#else
	程序段3(一堆代码)
#endif

#define MYPI 1
#if MYPI
	printf("MYPI is defined\n")
#else
	printf("MYPI is not defined\n")
#endif
#if _WIN32
	//WaitForSingleObject(...);//Windows专用函数
	printf("windows平台\n");
#elif __Linux__
	//epoll_create(...);//linux专用函数
	printf("linux平台\n");
#else
	//其它平台
#endif
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值