预处理的学习

简介: 预处理的学习

预定义符号

#define

#define宏定义,大多数用处是简化代码

#define MAX 1000
#define reg register          //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)     //用更形象的符号来替换一种实现
#define CASE break;case        //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
                          __FILE__,__LINE__ ,       \
                          __DATE__,__TIME__ )  

使用#define时后面不需要加分号,预编译的时候系统会默认添加

宏的申明

下面是宏的申明方式:

#define name( parament-list ) stuff

其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。

注意:

参数列表的左括号必须与name紧邻。

如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先

被替换。

2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。

3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上

述处理过程。

define只是替换不涉及类型

#define MUL(a,b) a*b
int main()
{
  int a = 5;
  int b = 10;
  int d = MUL(a, b);
  //预处理后等于
  int d = a * b;
  int f = MUL(a + 5, b);
  //预处理后等于
  int f = a + 5 * b;
  return 0;
}
//所以正确写法应该为#define MUL(a,b) ((a)*(b))
//以防优先级造成影响

宏和函数对比

1,宏和类型无关。

2. 宏是没法调试的。

3. 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。

4. 宏可能会带来运算符优先级的问题,导致程容易出现错。

目录
相关文章
|
1月前
|
编译器 C++
C 预处理器
C 预处理器。
42 10
|
4天前
|
安全 编译器 C语言
预处理详解
预处理详解
9 0
|
1月前
|
编译器 C语言
预处理深入
预处理深入
21 0
预处理深入
|
1月前
|
编译器 C语言
c预处理器
c预处理器
17 0
|
7月前
|
安全 编译器 C语言
详解预处理(1)
详解预处理(1)
57 1
|
7月前
|
编译器 Linux C语言
详解预处理(2)
详解预处理(2)
49 0
|
前端开发
Less预处理——初识Less
Less预处理——初识Less
|
编译器
【学习笔记之我要C】预处理
【学习笔记之我要C】预处理
63 0
|
编译器 C++
深入理解预处理器
深入理解预处理器
深入理解预处理器