移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

Similar documents
2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

chap07.key

C/C++程序设计 - 字符串与格式化输入/输出

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C/C++ - 函数

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

C/C++ - 文件IO

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

要 及 时 为 入 党 积 极 分 子 确 定 两 名 培 养 联 系 人, 进 行 联 络 帮 助 要 定 期 ( 每 季 度 至 少 一 次 ) 听 取 培 养 联 系 人 的 思 想 和 工 作 情 况 汇 报, 及 时 完 成 入 党 积 极 分 子 登 记 表 ( 见 附 件 2) 的 填

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C C

C

_汪_文前新ok[3.1].doc

C/C++语言 - C/C++数据

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C/C++语言 - 运算符、表达式和语句

发展党员材料填写参考(上网).doc

1.加入党组织主要经过哪些程序?

条 件 的 限 制, 可 在 广 西 参 加 普 通 高 考, 特 指 不 受 学 籍 户 籍 迁 入 的 年 限 限 制, 但 在 高 考 报 名 时 考 生 的 学 籍 户 籍 必 须 已 迁 入 广 西 二 外 来 人 员 需 要 提 供 的 审 查 材 料 ( 一 ) 按 照 自 治 区 招


Microsoft Word - 会协(2016)16号.doc

新版 明解C言語入門編

急 件             国质检食函[2003]681号

新・明解C言語入門編『索引』

untitled

网C试题(08上).doc

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

标准化党支部建设

新・解きながら学ぶC言語

投 身 基 层 建 功 立 业 政 治 部 主 任 李 继 耐 上 将 的 批 示 ( 照 片 ) 国 防 生, 梦 想 之 翼 能 飞 多 远? 对 清 华 大 学 国 防 生 走 基 层 之 路 的 追 踪 与 思 考 清 华 学 子 国 防 生 岱 天 荣 摄 - 1 -

没有幻灯片标题

untitled

C 1

プログラムの設計と実現II

C++ 程式設計

《C语言程序设计》教材习题参考答案

C语言的应用.PDF

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C/C++ - 字符输入输出和字符确认

材 料 目 录 1. 党 员 发 展 及 转 正 流 程 图 2. 申 请 入 党 人 员 基 本 信 息 及 培 养 记 录 表 3. 思 想 汇 报 传 阅 及 意 见 反 馈 表 4. 入 党 积 极 分 子 培 养 考 察 表 5. 政 治 审 查 函 调 信 模 板 6. 政 治 审 查

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

untitled

CC213

第3章、嵌入式Linux C语言高级用法

<4D F736F F D20C8EDBCFEB9A4B3CCCFEEC4BFD0E8C7F3B5F7D1D0B1A8B8E6B7B6B1BE>

ebook50-15

土 木 与 交 通 学 院 发 展 学 生 党 员 的 选 拨 条 件 与 推 荐 细 则 为 进 一 步 规 范 我 院 学 生 党 建 工 作, 加 强 和 完 善 我 院 对 学 生 党 员 各 个 阶 段 人 员 的 选 拔 和 培 养 工 作, 提 高 我 院 发 展 学 生 党 员 质

第7章-并行计算.ppt

《C语言程序设计》第2版教材习题参考答案

亮麗水顏

C/C++ 语言 - 循环

重 庆 市 万 州 区 人 民 政 府 公 报 卷 首 语 开 启 加 快 建 设 重 庆 第 二 大 城 市 新 征 程 1 万 州 区 委 区 政 府 文 件 传 达 政 令 宣 传 政 策 指 导 工 作 服 务 全 区 中 共 重 庆 市 万 州 区 委 重 庆 市 万 州 区 人 民 政

Ps22Pdf

C

期中考试试题讲解

C/C++语言 - 分支结构

Microsoft Word - 10 baogao_112_128.doc

C/C++ - 数组与指针

extend

ebook50-14

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C


nooog

bingdian001.com

<4D F736F F D20D0A3C6F3BACFD7F7A1B0B6A9B5A5B0E0A1B1B9DCC0EDB9E6B6A8A3A8CAD4D0D0A3A92E646F63>

untitled

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

C/C++ - 字符串与字符串函数

<4D F736F F D20B1D0A87CB3A1C5E9A87CB870B8C9A755B1C0B0CABEC7AED5C5E9A87CB942B0CAB56FAE69B867B64FADECAB682E646F6378>

[改訂新版]C言語による標準アルゴリズム事典

安徽电子工程学校

<4D F736F F D20BBFAB5E7BFD8D6C6B9A4B3CCD7A8D2B5BFCEB3CCC9E8BCC6D6B8B5BCB4F3B8D92E646F63>

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

台中商銀流程圖

Microsoft Word - 095_ 什麼最快樂 (白話與經文加註)-ok .doc

新版 明解C++入門編

目 录 专 稿 季 烨 文 革 之 初 北 京 师 大 二 附 中 的 红 色 暴 力 姜 培 良 之 死 与 仇 恨 教 育 评 论 唐 燕 关 于 北 京 女 十 中 教 师 孙 迪 之 死 给 王 友 琴 纠 错 校 史 王 逸 伦 编 辑 合 肥 市 第 六 中 学 校 史 关 于 文 革

Microsoft PowerPoint - ds-1.ppt [兼容模式]

untitled

邻居啊 第二天 对门却悄无声息了 莫非昨夜的吵闹 仅是个幻觉 夜幕拉下时 寒风又吱溜溜地叫个不停 老婆 睡下后 我这只夜猫子 继续兴致勃勃地跟着福尔 摩斯去探案 白天的喧嚣退去了 周围格外安静 正 是读书的好时候 突然 响起了钟摆声 哒 哒 哒 节奏匀称 不疾不徐 声响却愈来愈大 格外突兀 了 原来

<4D F736F F D BAC520CAD7B6BCCAA6B7B6B4F3D1A C4EAD7A8D2B5BCBCCAF5D6B0CEF1C6C0C6B8B9A4D7F7D2E2BCFB2E646F63>

其 他 方 面 也 可 以 采 用 同 样 的 方 式, 这 样 又 可 以 锻 炼 除 语 文 方 面 的 其 他 能 力 了 而 英 语 方 面, 我 认 为 配 合 英 语 专 业 举 办 英 语 演 讲 比 赛 就 很 不 错 这 样 开 展 一 系 列 的 创 新 活 动, 锻 炼 多 方

<4D F736F F D A67EABD7A4BAB3A1B1B1A8EEA8EEABD7A6DBA6E6B5FBA6F4AD70B5652E646F63>

统计工作情况汇报

Microsoft Word - 送報伕2.doc

Microsoft Word - N011 斷翅天使

中 国 科 学 院 国 家 科 学 图 书 馆

申论写作套路万能模板

申 请 律 师 执 业 许 可 初 审 服 务 指 南 目 录 一 办 理 要 素 ( 一 ) 事 项 名 称 和 编 码 4 ( 二 ) 实 施 机 构 4 ( 三 ) 申 请 主 体 4 ( 四 ) 受 理 地 点 4 ( 五 ) 办 理 依 据 4 ( 六 ) 办 理 条 件 5 ( 七 )

图 文 聚 焦 国 培 计 划 (2013) 甘 肃 省 农 村 小 学 音 乐 骨 干 教 师 短 期 集 中 培 训 9 月 4 日 开 班 了, 学 员 老 师 们 从 甘 肃 省 各 个 县 市 州 汇 聚 湖 南 一 师, 开 始 了 为 期 14 天 的 培 训 学 习 : 鲜 明 的

Microsoft Word - 三方协议书与接收函的相关说明学生版.doc

环 境, 我 在 巩 固 在 校 期 间 所 学 习 的 理 论 知 识 的 同 时, 不 断 的 充 实 己, 利 用 业 余 时 间 主 动 学 习 专 业 知 识, 技 能, 把 理 论 联 系 到 工 作 实 践 中 作 为 一 名 工 作 生 活 中 的 党 员, 我 始 终 注 意 与

附件1

第 六 条 办 法 第 五 条 ( 三 ) 协 会 考 评, 考 评 指 考 核 评 价 第 七 条 办 法 第 六 条 职 业 操 守 包 括 的 内 容 : 个 人 诚 信 不 做 假 账 不 偷 漏 税 不 贪 污 盗 窃 等 第 八 条 企 业 财 务 管 理 人 才 评 价 实 行 五 星

他 随 身 带 有 二 三 十 张 古 方, 白 天 卖 药, 夜 晚 将 药 材 精 细 研 末, 按 方 配 制 对 于 病 人 服 药 后 反 应, 特 别 留 心 发 现 问 题, 就 近 向 老 医 生 老 药 贩 虚 心 求 教, 千 方 百 提 高 药 效 同 时 对 于 春 夏 秋

目 录 第 一 章 地 方 陪 同 导 游 人 员 服 务 程 序...1 第 一 节 地 方 陪 同 导 游 人 员 的 概 念 与 职 责...1 第 二 节 服 务 准 备...2 一 熟 悉 接 待 计 划...2 二 落 实 接 待 事 宜...5 三 物 质 和 知 识 的 准 备...

Transcription:

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年

预处理 2

预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef #ifndef #include #if--#else--#endif 等 其他宏定义 #line #error #pragma # 开头占单独书写行语句尾不加分号可以使用续行标志 \ 3

宏定义 预处理模块只是用宏名作简单的替换, 不作语法检查, 若字符串有错误, 只有在正式编译时才能检查出来 没有特殊的需要, 一般在预处理语句的行末不必加分号, 若加了分号, 则连同分号一起替换 使用宏定义可以减少程序中重复书写字符串的工作量, 提高程序的可移植性 4

不带参数宏定义 一般形式 : #define 宏名 [ 宏体 ] 功能 : 用指定标识符 ( 宏名 ) 代替字符序列 ( 宏体 ) 如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf( Hello,World ); 例 #define WIDTH 80 #define LENGTH WIDTH+40 var=length*2; 宏展开 :var= 80+40 *2; 例 #define WIDTH 80 #define LENGTH ( WIDTH+40 ) var=length*2; 宏展开 :var= ( 80+40 ) *2; 例 #define MAX MAX+10 ( ) 5

不带参数宏定义 n 宏名一般习惯用大写字母表示, 以便与变量名相区别 n 宏定义不是 C 语句, 不必在行末加分号 n 在进行宏定义时, 可以引用已定义的宏名, 可层层替换 n 宏定义只作简单的替换, 不作正确性检查 n 宏名的有效范围为定义命令之后到本源文件结束 n 可以用 #undef 命令终止宏定义的作用域 n 程序中出现用双引号括起来的字符串中的字符, 若与宏名同名, 不进行替换 6

带参数宏定义 一般形式 : #define 宏名 ( 参数表 ) 宏体 例 #define S(a,b) a*b.. area=s(3,2); area=3*2; 宏展开 : 宏展开 : 形参用实参换, 其它字符保留 例 #define S (r) PI*r*r 相当于定义了不带参宏 S, 代表字符串 (r) PI*r*r 注意宏体的括号 例 #define POWER(x) x*x x=4; y=6; z=power(x+y); 宏展开 :z=x+y*x+y; 一般写成 : #define POWER(x) ((x)*(x)) 宏展开 : z=((x+y)*(x+y)); 7 不能加空格

文件包含 功能 : 一个源文件可将另一个源文件的内容全部包含进来一般形式 : #include 文件名 或 #include < 文件名 > 处理过程 : 预编译时, 用被包含文件的内容取代该预处理命令, 再对 包含 后的文件作一个源文件编译 #include file2.c A file1.c B file2.c file2.c A file1.c 8

被包含文件内容源文件 (*.c) 头文件 (*.h) 文件包含可嵌套 宏定义数据结构定义函数说明等 file3.h file2.h A file1.c #include file2.h A file1.c #include file3.h B file2.h C file3.h 9

n 例 子 /* powers.h */ #define sqr(x) ((x)*(x)) #define cube(x) ((x)*(x)*(x)) #define quad(x) ((x)*(x)*(x)*(x)) #include <stdio.h> #include "powers.h" #define MAX_POWER 10 void main() { int n; printf("number\t exp2\t exp3\t exp4\n"); printf("----\t----\t-----\t------\n"); for(n=1;n<=max_power;n++) printf("%2d\t %3d\t %4d\t %5d\n",n,sqr(n),cube(n),quad(n)) } 10

条件编译 C 语言的编译预处理器还提供了条件编译能力, 使得可以对源程序的一部分内容进行编译, 即不同的编译条件产生不同的目标代码 #ifdef..#else #endif #ifndef..#else #endif #undef #if..#else #endif 11

#ifdef..#else #endif #ifdef 标识符程序段 1 #else 程序段 2 #endif 若标识符已经被定义过 ( 一般用 #define 命令定义 ), 那么程序段 1 参加编译, 否则程序段 2 参加编译, 其中 #else 部分可以省略 #ifdef 标识符程序段 1 #endif 12

#ifndef..#else #endif #ifndef 标识符程序段 1 #else 程序段 2 #endif 若标识符没有定义, 程序段 1 参加编译, 否则程序段 2 参加编译, 其中 #else 部分可以省略 #ifndef 标识符程序段 1 #endif 13

#undef 将已定义的标识符变为未定义的 例如 : 若 #undef DEBUG 则语句 : #ifdef DEBUG // 为假 (0) 而语句 : #ifndef DEBUG // 为真 ( 非 0) 14

#if 表达式程序段 1 #else 程序段 2 #endif #if..#else #endif 若表达式为 真 ( 非 0), 程序段 1 参加编译, 否则程序段 2 参加编译, 其中 #else 部分可以省略 #if 表达式程序段 1 #endif 15

使用技巧 防 止 一个头 文件被重复包含 求最 大值和最 小值 计算数组元素的个数 #ifndef COMDEF_H #define COMDEF_H // 头文件内容 #endif #define MAX( x, y ) ( ((x) > (y))? (x) : (y) ) #define MIN( x, y ) ( ((x) < (y))? (x) : (y) ) #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) ) 16

#error 预定义宏 #line # 和 ## 运算符 其他预处理指令 17

#error #error 指令强制编译程序停止编译, #error 指令的一般形式是 #error error-message 注意 : 宏串 error-message 不用双引号包围 可以自定义错误内容 不同于 printf, 在编译期间输出信息 通常与 #if 等, 配合使用 主要用于程序调试 18

预定义宏 DATE 进行预处理的日期 ( Mmm dd yyyy 形式的字符串文字 ) FILE 代表当前源代码文件名的字符串文字 LINE 代表当前源代码中的行号的整数常量 TIME 源文件编译时间, 格式微 hh:mm:ss func 当前所在函数名 19

#include <stdio.h> #include <stdlib.h> void why_me(); int main() { printf( "The file is %s.\n", FILE ); printf( "The date is %s.\n", DATE ); printf( "The time is %s.\n", TIME ); printf( "This is line %d.\n", LINE ); printf( "This function is %s.\n", func ); why_me(); return 0; } void why_me() { printf( "This function is %s\n", func ); printf( "The file is %s.\n", FILE ); printf( "This is line %d.\n", LINE ); }

#line #line 指令改变 LINE 和 FILE 的内容 #line 的一般形式 #line number filename 主要用于调试和特殊应用 21

# 和 ## 宏 # 运算符, 通常称为字符串化的操作符, 将宏的一个参数转换为字符串 #include <stdio.h> #define mkstr(s) #s int main(void) { printf(mkstr(i like C)); return 0; } 预处理程序把以下的语句 : printf(mkstr(i like C)); 处理为 printf( I like C ); 宏 # 运算符仅允许出现在带参数的宏的替换列表中 22

# 和 ## 宏 ## 运算符, 将两个记号 ( 如标识符 ) 粘合 在一起, 成为一个记号 #include<stdio.h> #define SORT(X) sort_function # # X void main(void) { char *array; int elements,element_size;. SORT(3) (array,elements, element_size); } 结果 : SORT(3) 转化为 sort_function3 SORT(3) (array,elements,element_size) 转化为 sort_function3(array,elements,element_size 23

Q&A 本讲结束!