C/C++预处理过程

本文详细介绍了C/C++编程中的预处理过程,包括预定义符号、#define常量与宏的使用、带有副作用的宏参数、宏替换规则、宏与函数的区别、#和##运算符、命名约定、undef指令,以及头文件包含和条件编译的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言:

1. 预定义符号

2. #define定义常量

3. #define定义宏

4. 带有副作用的宏参数

5.  宏替换的规则

6. 宏和函数的对比

7. #和##

8.  命名约定

9.  #undef

10.  命令行定义

11.  条件编译

12.  头文件的包含

13.  其他预处理指令

总结:


前言:

本篇介绍c/c++的预处理过程,c和c++在预处理阶段基本相同。

1. 预定义符号

c语言定义了一些预处理的符号,这些是可以直接使用的,并且这些符号也是在预处理期间完成的。

  • __FILE__ //进⾏编译的源⽂件
  • __LINE__ //⽂件当前的⾏号
  • __DATE__ //⽂件被编译的⽇期
  • __TIME__ //⽂件被编译的时间
  • __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义

2. #define定义常量

例如我们定义100为一个MAX,后面使用MAX都会在预处理阶段替换为100。

#define MAX 100

如果我们觉得定义的东西太长了,也可以分行写,在结尾加上反斜杠\即可:

#define DEBUG_PRINT printf("file:%s\tline:%d\t \
 date:%s\ttime:%s\n" ,\
 __FILE__,__LINE__ , \
 __DATE__,__TIME__ )

现在来考虑一个问题:

在定义常量的时候,要不要加上引号???

#define MAX 1000;
#define MAX 1000

 其实通过#define的性质就可以知道,它在预处理阶段做的只是替换工作,如果将代码放到下面的情况下就会出错:

if(condition)
 max = MAX;
else
 max = 0;

 这样if后面就是两条语句了,而由于if如果不加大括号匹配的只有一条语句,所以这样else就没法匹配了,就出错了。

 

3. #define定义宏

#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。

语法为:

#define name( parameter-list ) stuff

注意参数列表的括号必须要与name之间没有空格,不然参数列表就被识别为右边的内容了。

 

例如我们现在实现一个宏来实现乘法:

#define SQUARE( x ) x * x

可这样能表达我们想要的意思吗???

我们要注意宏仅仅是替换,所以在打印下面的情况下,就会出错:

	int a = 5;
	printf("%d\n", SQUARE(a + 1));//结果是11

我们想表达的是(5+1)*(5+1),而结果却是11,这就是因为宏仅仅是替换,只是替换为了a+1*a+1,所以我们加上扩号就能达到预期的效果了。

#define SQUARE
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值