C预处理器

2018-08-21  本文已影响0人  執著我們的執著

C预处理器

C预处理器处理程序的源代码,在编译之前运行,通常以符号#开头,C语言的预处理主要有3个方面的内容(下三)

1. 宏定义和宏替换 #define

"宏"是借用汇编语言中的概念,为了是方便作一些定义和扩展

#define开头,分为

1.1 符号常量的宏定义#define 标识符 字符串
注:其中标识符就是宏名称,用来标识常量字符串的,另外宏定义末尾不加分号

由于预处理是在编译之前,故预处理不做语法检查
且宏定义不分配内存,变量定义才会分配内存

1.2 带参数的宏定义及其替换#define 标识符(参数表) 字符串
对带参数的宏定义进行宏替换时,不仅对宏标识符作字符串替换,还必须做参数的替换
例: 有宏定义 #define Func(x) (x*x),则 Fun(a+B)将会被替换成什么?
答: 替换成 (a+B*a+B)
可见如果想实现(a+B)*(a+B),则正确的宏定义应该为:#define Func(r) ((r)*(r))

故:为了避免宏替换时发生错误,宏定义中的宏参数应加上括号

宏定义可以嵌套使用:
例:
#define ADD(x, y) x+y
int m = 3;
m + = m * ADD(m, m);
m = ?
解析:

m + = m* ADD(m, m);
m = m + m * m + m = 3+ 3*3 +3 = 15

1.3 宏定义的本质即文本替换:

关于宏定义和宏替换注意点

注: 应尽量少用宏替换,在C++中,宏替换实现的常量功能由const,enum代替,带参数的宏替换由模板内联函数代替

2. 文件包含 #include

#include <iostream>< >标准头文件
#include "a.h"" "自定义头文件

3. 条件编译

作用:可使同一源程序根据不同编译条件(参数)产生不同的目标代码,便于调试和移植

形式:(条件编译控制语句有不同形式)

#if / ifdef / ifndef
#elif
#else
#endif

文件包含需避免多重包含,下面介绍利用条件编译语句避免多重包含:

举个格式例子
#ifndef SALESITEM_H
#define SALESITEM_H
// 此处是某个类的定义与相关函数定义
#endif

为了保证头文件在给定的源文件中只处理一次,首先检测#ifndef,若第一次处理,则#ifndef后面的语句执行,直到#endif,那样,已定义过后,之后编译时就会忽略。

上一篇下一篇

猜你喜欢

热点阅读