《C和指针》笔记(十一)-- 预处理器

C/C++ 笔记

QQ : 1841545843
邮箱 : jiaxx903@163.com

  1. 编译一个c程序涉及很多步骤,第一个阶段为预处理阶段。在源代码编译之前做一些文本性的操作。
  • 删除注释
  • 插入被#include包含的内容或文件
  • 定义和替换#define指令定义的符号以及确定代码的部分内容是否应更具一些条件编译进行编译
  1. 预定义符号
* __FILE__     "name.c"                                         进行编译的源文件名
* __LINE__       25                                             文件当前行的行号
* __DATE__    "Jan 31 1997"                                     文件被编译的日期
* __TIME__     "18:04:30"                                       文件被编译的时间
* __STDC__     1                                                如果编译器遵循ANSI C,其值为1     
  1. #define
    为数值命名一个符号

#define name stuff

每当有name出现时都替换为stff;

#define for(; ; )                                   // 定义一个死循环
#define DEBUG_PRINT printf("FILE %s linne %d: " \
							"x = %d, y = %d, z = %d", \
  							__FILE__, __LINE__,\
							x, y, z)
  • 不应该在宏定义的尾部加上 分号
#defien name(parameter_list) stuff       		// 参数列表由 逗号 隔开
#define  SQUARE(x)    ((x) * (x))           // 加括号是防止优先级不同导致出现错误的结果, 先替换,再计算

// 调用
SQUARE(5)             // 注意后边不用 分号 结尾
  1. ‘##’ 把位于它两边的符号连接成一个符号
  2. 宏非常频繁的用于执行简单计算
#define MAX(a, b)   ((a) > (b) ? (a) : (b))

宏优点:

  • 结构简单轻量
  • 与类型无关
  1. #undef 用于移除一个宏定义
#undef name

如果现存的名字需要重新定义,则它以前的名字必须先移除。
8. -D可以在命令行中指定宏的值。
9. -U去除符号的定义
10. 条件编译
可以选择代码的一部分是被正常编译还是被完全忽略。

#if constant_expression
	statements
#endif

constant_exoression 由预处理器进行求值,如果为真,sataements部分被编译, 否则被删除
实例:


#if DEBUG
-----
#endif

// 定义DEBUG
#define DEBUG 1
#if ...
	...
#elif ...
 	...
 #else
 	...
 #endif

  1. 判断一个符号是否被定义
//  symbol被定义
#if  defined(symbol)
#ifdef  symbol

// symbol未被定义
#if  !defined(symbol)
#ifndef  symbol

// 每对定义的两个语句都是等价的
  1. 嵌套语句
#if  defiened(OS_UNIX)
	#ifdef  OPTION1
		...
	#endif
	#ifdef OPTION2
		...
	#endif
#elif  defined (OS_MSDOS)
	#ifdef OPTIO2
		...
	#endif
#endif
// 操作系统的选择决定不同方向
  1. 防止多重包含
#ifndef  _HEADERNAME_H
#define  _HEADERNAME_H  1
	...
#endif
//  当头文件第一次被包含时,它被正常处理,符号定义为1, 如果再次被包含,通过条件编译,它的所有内容被忽略
  1. 其他指令
//  生成错误信息
#error text of error message

//  通知预处理器number是下一行行号
#line number "string"

// 支持因编译器而异的特性
#progma

//  无效指令,  以 # 开头, 后面不跟任何内容的一行, 这类指令只是被编译器简单的删除

#                                       //  无效指令,区分 include
#include <stdio.h>
#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值