目录 8.1 宏定义 8.2 文件包含 8.3 条件编译 1.

Slides:



Advertisements
Similar presentations
45天备考指南 2013年下半年国考资格证笔试系列讲座(2) 华图教师事业部 石杨平.
Advertisements

电子成绩单项目实现.
2014政法干警备考平台 2014政法干警考试群⑨ 中公教育政法干警考试 ——微博 中公教育政法干警考试
如何开好通表会 荔湾区教育局第二期学生团干培训 2009年9月 1.
仓颉造字 相传仓颉在黄帝手下当官。那时,当官的可并不显威风,和平常人一样,只是分工不同。黄帝分派他专门管理圈里牲口的数目、屯里食物的多少。仓颉这人挺聪明,做事又尽力尽心,很快熟悉了所管的牲口和食物,心里都有了谱,难得出差错。可慢慢的,牲口、食物的储藏在逐渐增加、变化,光凭脑袋记不住了。当时又没有文字,更没有纸和笔。怎么办呢?仓颉犯难了。
6.4 字符串与指针 1. 用字符数组存放一个字符串.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第5章 函数与预处理 《 C语言程序设计》 (Visual C++ 6.0环境) 本章导读
第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第13章 编译预处理 宏定义 文件包含 条件编译.
第10章 预处理过程 一、编译预处理指令概述 二、预处理指令 #include 三、#define指令.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
辅导课程六.
元素替换法 ——行列式按行(列)展开(推论)
网络常用常用命令 课件制作人:谢希仁.
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第二章 Java语言基础.
第12章 编译预处理 12.1 了解编译预处理 12.2 宏 定 义 12.3 文 件 包 含 12.4 条 件 编 译.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第八章 编译预处理 西安工程大学.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
第6章 预 处 理.
第九章 预处理命令.
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第8章 编绎和预处理.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
$9 泛型基础.
程式結構&語法.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C程序设计 谭浩强 著 清华大学出版社.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
C语言程序设计.
姚金宇 MIT SCHEME 使用说明 姚金宇
今天, AC 你 了吗? 2019/4/21.
C语言程序设计 第九章 预处理命令.
目录 7.1 用户自定义函数的种类 7.2 函数的定义 7.3 被调函数的声明 7.4 函数的调用 7.5 函数的嵌套调用
目录 4.1选择结构程序设计的概述 4.2关系运算符和表达式 4.3逻辑运算符和表达式 4.4用if语句实现选择结构程序设计
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
目录 1.1程序设计语言 1.2程序结构及其特点 1.3Visual C++6.0的安装及使用 1.
第4章 Excel电子表格制作软件 4.4 函数(一).
第七单元 应用函数程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
第九节 赋值运算符和赋值表达式.
第6章 预 处 理.
3.16 枚举算法及其程序实现 ——数组的作用.
第8章 编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。 8.1 宏定义与符号常量 8.2 文件包含 8.3 条件编译 [Return]
C程序设计.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第9章 预处理命令.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
目录 12.1 位运算符 12.2 位域(位段) 1.
第18讲 从C到C++ 计算机与通信工程学院.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第四章 UNIX文件系统.
第7章 过 程 Visual Basic中过程分为两种,一种是事件过程,例如前面涉及到的按钮的Click事件过程、窗体的Load事件过程等。另一种是通用过程,它主要用来让事件过程或其他通用过程调用。本章主要介绍的就是这种过程。
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
THE C PROGRAMMING LANGUAGE
C语言基础学习 从外行到入门.
Presentation transcript:

目录 8.1 宏定义 8.2 文件包含 8.3 条件编译 1

8.1 宏定义 1. 无参宏定义 1)无参宏定义的一般形式 #define 标识符 字符串 8.1 宏定义 1. 无参宏定义 1)无参宏定义的一般形式 #define 标识符 字符串 凡是以#开头的均为预处理命令,define为宏定义命令;标识符为所定义的宏名;字符串可以是常数、变量、函数或表达式等。 符号常量的定义就是一种无参宏定义。此外,程序中反复使用的表达式多被定义成宏。例如: #define m (y*y+3*y) 它的作用是指定标识符m来代替表达式(y*y+3*y)。在编写源文件时,所有的(y*y+3*y)都可由m代替,而对源文件作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名m,然后再进行编译。 2

8.1 宏定义 1. 无参宏定义 1)无参宏定义的一般形式 为了避免宏代换时发生错误,宏定义中的字符串应加括号。 8.1 宏定义 1. 无参宏定义 1)无参宏定义的一般形式 为了避免宏代换时发生错误,宏定义中的字符串应加括号。 【例8_1】无参宏定义、宏调用与宏展开。 #include<stdio.h> #define m (y*y+3*y) void main() { int s,y; printf("input a number: ");scanf("%d",&y); s=3*m+4*m+5*m; printf("s=%d\n",s); } 3

8.1 宏定义 1. 无参宏定义 2)宏定义注意事项 (1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如果宏定义有错误,只能在编译已被宏展开后的源文件时发现。 (2)宏定义不是声明或语句,在行末不必加分号,如加上分号则连分号也一起置换。 (3)宏定义必须写在函数之外,其作用域为从宏定义命令开始到源文件结束为止。如果要终止其作用域可使用# undef 命令。 4

8.1 宏定义 1. 无参宏定义 2)宏定义注意事项 (4)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如: #define pi 3.1415926 #define s pi*y*y /* pi是已定义的宏名*/ 对语句:printf("%f",s); 在宏代换后变为: printf("%f",3.1415926*y*y); (5)习惯上,宏名用大写字母表示,以便于与变量区别;但也允许用小写字母。 5

8.1 宏定义 2)带参宏调用的一般形式 2. 带参宏定义 1)带参宏定义的一般形式 #define 宏名(形参表) 字符串 8.1 宏定义 2. 带参宏定义 1)带参宏定义的一般形式 #define 宏名(形参表) 字符串 2)带参宏调用的一般形式 宏名(实参表); 【例8_2】带参宏定义、宏调用与宏展开。 #include<stdio.h> #define max(a,b) (a>b)?a:b void main() { int x,y,max; printf("input two numbers: "); scanf("%d%d",&x,&y); max=max(x,y); printf("max=%d\n",max); } 6

8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (1)带参宏定义中,宏名和形参表之间不能有空格出现。 8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (1)带参宏定义中,宏名和形参表之间不能有空格出现。 (2)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值,用实参替代形参,因此实参必须作类型声明;在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋给形参,进行值传递;而在带参宏中,只是符号代换,不存在值传递的问题。 (3)在宏定义中的形参只能是标识符,而宏调用中的实参可以是表达式。 7

8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 【例8_3】实参为表达式的宏调用。 8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 【例8_3】实参为表达式的宏调用。 #include<stdio.h> #define sq(y) (y)*(y) void main() { int a,sq; printf("input a number: "); scanf("%d",&a); sq=sq(a+1); printf("sq=%d\n",sq); } 8

8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (4)为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符中出现的形参也应加括号。 【例8_4】形参未加括号的错误。 #include<stdio.h> #define sq(y) y*y void main() { int a,sq; printf("input a number: "); scanf("%d",&a); sq=sq(a+1); printf("sq=%d\n",sq); } 9

8.1 宏定义 2. 带参宏定义 【例8_5】只形参加括号的错误。 3)带参的宏定义注意事项 8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (4)为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符中出现的形参也应加括号。 【例8_5】只形参加括号的错误。 #include<stdio.h> #define sq(y) (y)*(y) void main() { int a,sq; printf("input a number: "); scanf("%d",&a); sq=150/sq(a+1); printf("sq=%d\n",sq); } 10

8.1 宏定义 2. 带参宏定义 【例8_6】形参和字符串都加括号,无错误。 3)带参的宏定义注意事项 8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (4)为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符中出现的形参也应加括号。 【例8_6】形参和字符串都加括号,无错误。 #include<stdio.h> #define sq(y) ((y)*(y)) void main() { int a,sq; printf("input a number: "); scanf("%d",&a); sq=150/sq(a+1); printf("sq=%d\n",sq); } 11

8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (5)带参的宏和带参函数很相似,但有本质上的不同,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。 【例8_7】参数传递。 #include<stdio.h> void main() { int i=1; while(i<=5) printf("%d\n",sq(i++)); } sq(int y) { return((y)*(y)); 12

8.1 宏定义 2. 带参宏定义 3)带参的宏定义注意事项 (5)带参的宏和带参函数很相似,但有本质上的不同,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。 【例8_8】宏替换。 #include<stdio.h> #define sq(y) ((y)*(y)) void main() { int i=1; while(i<=5) printf("%d\n",sq(i++)); } 13

8.2 文件包含 1. 文件包含的一般形式 2.文件包含的功能 #include"文件名"或#include<文件名> 8.2 文件包含 1. 文件包含的一般形式 #include"文件名"或#include<文件名> 两种形式的区别:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。 2.文件包含的功能 把指定的文件插入该命令位置取代该命令,从而把指定的文件和当前的源文件连成一个源文件。 在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块,由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错。 14

8.2 文件包含 1. 文件包含使用注意事项 (1)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。 (2)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。 15

8.3 条件编译 1.第一种形式 #ifdef 标识符 程序段1 #else 程序段2 #endif 8.3 条件编译 1.第一种形式 #ifdef 标识符 程序段1 #else 程序段2 #endif 它的功能是,如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2,本格式中的#else可以省略,即可以写为: 程序段 16

8.3 条件编译 1.第一种形式 【例8_9】条件编译的第一种形式。 #include<stdio.h> 8.3 条件编译 1.第一种形式 【例8_9】条件编译的第一种形式。 #include<stdio.h> #define num ok void main() { #ifdef num printf("Yes\n"); #else printf("No\n"); #endif } 17

8.3 条件编译 1.第二种形式 3.第三种形式 #ifndef 标识符 程序段1 #else 程序段2 #endif 8.3 条件编译 1.第二种形式 #ifndef 标识符 程序段1 #else 程序段2 #endif 功能:如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。 3.第三种形式 #if 常量表达式 功能:如常量表达式的值为真,则对程序段1进行编译,否则对程序段2进行编译。 18