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

2023-05-16

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

  • 8.1 宏定义
    • 8.1.1 无参宏定义
    • 8.1.2 带参宏定义
  • 8.2 文件包含和条件编译
    • 8.2.1 文件包含
    • 8.2.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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《C++新经典》第8章 编译预处理 的相关文章

随机推荐