C语言编译预处理文件练习题

C语言编译预处理文件练习题
C语言编译预处理文件练习题

7.1编译预处理

1.以下关于文件包含的说法中错误的是

A.文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。

B.文件包含处理命令的格式为

#include“包含文件名”或#include<包含文件名> C.一条包含命令可以指定多个被包含文件

D.文件包含可以嵌套,即被包含文件中又包含另一个文件。

2.以下程序的输出结果是

#define MAX(x,y)(x)>(y)?(x):(y)

main()

{

int a=5,b=2,c=3,d=3,t;

t=MAX(a+b,c+d)*10;

printf(“%d\n”,t);

}

A.70B.60C.7D.6

3.下面程序的功能是通过带参的宏定义求圆的面积,在应填充#define PI 3.1415926

#define AREA(r)

main()

{

float r=5;

printf("%f",AREA(r));

}

A.PI*(r)*(r)B.PI*(r)C.r*r D.PI*r*r

4.以下叙述正确的是

A.可以把define和if定义为用户标识符

B.可以把define定义为用户标识符,但不能把if定义为用户标识符C.可以把if定义为用户标识符,但不能把define定义不用户标识符D.define和if都不能定义为用户标识符

5.#define PI 3.14

#define R 5.0

#define S PI*R*R

main()

{printf("%f",S);}

A.3.14B.78.500000C.5.0D.无结果

7.2文件

1.下列语句中,将C定义为文件型指针的是

A.FILE c;B.FILE*c;

C.file c;D.file*c;

2.若有定义FILE*fp,则打开与关闭文件的命令是

A.fopen(fp),fclose(fp)B.fopen(fp,“w”),fclose(fp)

C.open(fp),close(fp)D.open(fp,“W”),close(fp)

3.C语言中,组成数据文件的成分是

A.记录B.数据行C.数据块D.字符(字节)序列

4.若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是

A.fopen("A:\user\abc.txt","r+")

B.fopen("A:\user\abc.txt","r")

C.fopen("A:\user\abc.txt","rb")

D.fopen("A:\user\abc.txt","w")

5.下列关于C语言数据文件的叙述中正确的是

A.文件由ASCII码字符序列组成,C语言只能读写文本文件

B.文件由二进制数据序列组成,C语言只能读写二进制文件

C.文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件

D.文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

C语言习题集(预处理命令篇)

第六章预处理命令 6.1 选择题 1.下面叙述中正确的是()。 A. 带参数的宏定义中参数是没有类型的 B. 宏展开将占用程序的运行时间 C. 宏定义命令是C语言中的一种特殊语句 D. 使用#include命令包含的头文件必须以“.h”为后缀 2.下面叙述中正确的是()。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换 3.在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为()。 A. 直接按系统设定的标准方式搜索目录 B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 4.下面叙述中不正确的是()。 A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的 字符替换 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进 行的,在展开时也要分配内存单元,进行值传递 C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问 题,宏没有类型 D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果 5.下面叙述中不正确的是()。 A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进 行的,在展开时不分配内存单元,不进行值传递 C. 宏替换占用编译时间 D. 函数调用占用编译时间 6.下面叙述中正确的是( )。 A. 可以把define和if定义为用户标识符 B. 可以把define定义为用户标识符,但不能把if定义为用户标识符 C. 可以把if定义为用户标识符,但不能把define定义为用户标识符 D. define和if都不能定义为用户标识符 7.下面叙述中正确的是()。 A.#define和printf都是C语句 B.#define是C语句,而printf不是 C.printf是C语句,但#define不是 D.#define和printf都不是C语句

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等) 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令用途 #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 一、文件包含 #include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。 预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如: #defineAAA #include"t.c" #undefAAA #include"t.c" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /*my.h*/ #ifndefMY_H

c语言第8章编译预处理及位运算习题答案.doc

编译预处理习题 一.单项选择题 1.在宏定义#define A 3.897678中,宏名A代替一个()。 A)单精度数 B)双精度数 C)常量 D)字符串 2.以下叙述中正确的是 A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间 3.C语言的编译系统对宏命令的处理()。 A)在程序运行时进行的 B)在程序连接时进行的 C)和C程序中的其它语句同时进行的 D)在对源程序中其它语句正式编译之前进行的 4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式 是()。 A)直接按系统设定的标准方式搜索目录 B)先在源程序所在目录搜索,再按系统设定的标准方式搜索 C)仅仅在源程序所在目录搜索 D)仅仅搜索当前目录 5.以下说法中正确的是 A)#define和printf都是C语句 B)#define是C语句,而printf不是 C)printf是C语句,但#define不是D)#define和printf都不是C语句 6.#define A 3.897678 #include main( ) { printf(“A=%f ”,A); } 程序运行结果为()。 A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b #define LJ(a,b) (a)*(b) 在后面的程序中有宏引用:x=LI(3+2,5+8); y=LJ(3+2,5+8); 则x、y的值是()。 A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=21 8.有以下程序 # define f(x) (x*x) main() { int i1, i2; i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ; printf("%d, %d\n",i1,i2); } 程序运行后的输出结果是

C语言程序设计教案 第九章 编译预处理

第九章编译预处理 课题:第九章编译预处理 教学目的:1、了解预处理的概念及特点 2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果 教学重点:教学难点:掌握宏的使用,文件包含有参宏与无参宏的使用 步骤一复习引导 ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。 这些预处理命令是由ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。 步骤二讲授新课 C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。C 提供的预处理功能主要有以下三种:宏定义、文件包含、条件编译。 分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“ #” 开头。 §9.1宏定义 宏:代表一个字符串的标识符。 宏名:被定义为“宏”的标识符。 宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。 一、不带参数的宏定义 一般形式:#define 标识符字符串 #define PI 3.1415926 main() { float l, s, r, v; printf( “input radius:” ); scanf( “%f”, &r ); l = 2.0*PI*r; s = PI*r*r; v = 3.0/4*PI*r*r*r; printf(“%10.4f,%10.4f,%10.4\n”, l, s, v); }

C语言条件编译及编译预处理阶段

C语言条件编译及编译预处理阶段 一、C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件其中编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。 在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。 二、伪指令(或预处理指令)定义 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码, 其实就是elseif的简写 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 三、预处理指令主要包括以下四个方面: 1、宏定义指令 宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全局符号。宏的第二种用法是定义带参数的宏(宏函数),这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并

C语言预处理命令总结大全

C语言预处理命令总结大全 (2012-02-13 17:18) 标签: C语言预处理分类:C编程 C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C 语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一 #define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier string 注意: 1该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。 2宏名定义后,即可成为其它宏名定义中的一部分。 3 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如: #define XYZ this is a tes 使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识别出的是"XYZ" 4如果串长于一行,可以在该行末尾用一反斜杠' \'续行。 #defineLONG_STRING"this is a very long\ string that is used as an example" 5 C语言程序普遍使用大写字母定义标识符。 6 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不 存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二 #error 命令#error强迫编译程序停止编译,主要用于程序调试。 #error指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。 三 #include

第12章 C语言的编译预处理

第12章 C 语言的编译预处理 C 语言属于高级语言,用C 语言编写的程序称为源程序,这种用高级语言编写的源程序 计算机是不能直接执行的,必须经过C 语言的编译系统把源程序编译成目标程序(机器指令构成的程序)并连接成可执行程序,计算机才可以执行。因此,用C 语言来处理问题,必须经过程序的编写→编译及连接→运行三个主要过程。然而,为了减少C 源程序编写的工作量,改善程序的组织和管理,帮助程序员编写易读、易改、易于移植、便于调试的程序,C 语言编译系统提供了预编译功能。 所谓的预编译功能是指:编译器在对源程序正式编译前,可以根据预处理指令先做一些 特殊的处理工作,然后将预处理结果与源程序一起进行编译。 C 语言提供的编译预处理功能主要有三种:文件包含、宏定义、条件编译。这三种功能 分别以三条编译预处理命令#include 、#define 、#if 来实现。编译预处理指令不属于C 语言的 语法范畴,因此,为了和C 语句区别开来,预处理指令一律以符号“#”开头,以“回车” 结束,每条预处理指令必须独占一行。 12.1 文件包含预处理 “包含”的英文单词为“include ”,所谓“文件包含”预处理,就是在源文件中通过“#include ”命令指示编译器将另一段源文件包含到本文件中来。 例如,源文件f1.c 中有一句“#include f2.c ”编译预处理命令,如图12-1(a)所示。编译预处理后文件f1.c 的完整结构如图12-1(c)所示。 图12-1 文件包含编译预处理命令 编译时先将f2.c (图12-1(b))的内容复制嵌入到f1.c (图12-1(a))中来,即进行“包含” 预处理,然后对调整好的完整的f1.c (图12-1(c))进行编译,得到相应的目标代码。换句话说,由f1.c 和f2.c 组成程序的目标代码(.obj )和用一个源文件(类似于图c )的目标代码(.obj )完全一样。但是用#include 包含f2.c 的方式编写程序可以使其他的程序重用f2.c 的代码,并且使源文件简洁明了。 “文件包含”指令有两种使用方式: 第一种形式,用尖括号(即小于号<、大于号>)括起被包含源文件的名称: #include <文件名> f1.c ……… ……… ……… ……………… ……………… ……………… ……………… ……………… ……………… #include f2.c ……………… ……………… ……………… ……………… ……………… ……………… f1.c (a) 预编译前 (b) (c) 预编译后

C语言预处理命令总结大全

C语言预处理命令总结大全 标签: C语言预处理分类:C编程 C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一 #define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier string 注意: 1该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。 2宏名定义后,即可成为其它宏名定义中的一部分。 3 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如: #define XYZ this is a tes 使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识别出的是"XYZ" 4如果串长于一行,可以在该行末尾用一反斜杠' \'续行。 #defineLONG_STRING"this is a very long\ string that is used as an example" 5 C语言程序普遍使用大写字母定义标识符。 6 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用 的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二 #error 命令#error强迫编译程序停止编译,主要用于程序调试。 #error指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。 三 #include 命令#i nclude使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如: #include"stdio.h"或者#include 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。

C语言编程常见问题解答之编译预处理

C语言编程常见问题解答之编译预处理 本章集中讨论与预处理程序有关的问题。在编译程序对程序进行通常的编译之前,要先运行预处理程序。可能你以前没有见过这个程序,因为它通常在幕后运行,程序员是看不见它的,然而,这个程序非常有用。 预处理程序将根据源代码中的预处理指令来修改你的程序。预处理指令(如#define)为预处理程序提供特定的指令,告诉它应该如何修改你的源代码。预处理程序读入所有包含的文件和待编译的源代码,经过处理生成源代码的预处理版本。在该版本中,宏和常量标识符已用相应的代码和值代替。如果源代码中包含条件预处理指令(如#if),预处理程序将先判断条件,然后相应地修改源代码。 预处理程序有许多非常有用的功能,例如宏定义,条件编译,在源代码中插入预定义的环境变量,打开或关闭某个编译选项,等等。对专业程序员来说,深入了解预处理程序的各种特征,是创建快速和高效的程序的关键之一。 在阅读本章时,请记住本章采用的一些技术(以及所提到的一些常见陷阱),以便更好地利用预处理程序的各种功能。 5.1 什么是宏(macro)?怎样使用宏? 宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串,宏是用“#define"语句定义的,下面是一个宏定义的例子: #define VERSION—STAMP "1.02" 上例中所定义的这种形式的宏通常被称为标识符。在上例中,标识符VERSION_STAMP 即代表字符串"1.02"——在编译预处理时,源代码中的每个VERSION_STAMP标识符都将被字符串“1.02”替换掉。 以下是另一个宏定义的例子: #define CUBE(x) ((x)*(x)*(x)) 上例中定义了一个名为CUBE的宏,它有一个参数x。CUBE宏有自己的宏体,即((x)*(x)*(x))——在编译预处理时,源代码中的每个CUBE(x)宏都将被((x)*(x)*(x))替换掉。 使用宏有以下几点好处;

C语言编译预处理文件练习题

7.1编译预处理 1.以下关于文件包含的说法中错误的是 A.文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。 B.文件包含处理命令的格式为 #include “包含文件名”或#include <包含文件名> C.一条包含命令可以指定多个被包含文件 D.文件包含可以嵌套,即被包含文件中又包含另一个文件。 2.以下程序的输出结果是 #define MAX(x,y) (x)>(y)?(x):(y) main() { int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(“%d\n”,t); } A.70 B.60 C.7 D.6 3.下面程序的功能是通过带参的宏定义求圆的面积,在应填充#define PI 3.1415926 #define AREA(r) main() { float r=5; printf("%f",AREA(r)); } A.PI*(r)*( r) B.PI*(r) C.r*r D.PI*r*r 4.以下叙述正确的是 A.可以把define和if定义为用户标识符 B.可以把define定义为用户标识符,但不能把if定义为用户标识符C.可以把if定义为用户标识符,但不能把define定义不用户标识符D.define和if都不能定义为用户标识符 5.#define PI 3.14 #define R 5.0 #define S PI*R*R main() { printf("% f",S);} A.3.14 B.78.500000 C.5.0 D.无结果

7.2 文件 1.下列语句中,将C定义为文件型指针的是 A.FILE c; B.FILE *c; C.file c; D.file *c; 2.若有定义FILE *fp,则打开与关闭文件的命令是 A.fopen(fp),fclose(fp) B.fopen(fp,“w”),fclose(fp) C.open(fp),close(fp) D.open(fp,“W”),close(fp) 3.C语言中,组成数据文件的成分是 A. 记录B.数据行C.数据块D.字符(字节)序列 4.若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是 A.fopen("A:\user\abc.txt","r+") B.fopen("A:\user\abc.txt","r") C.fopen("A:\user\abc.txt","rb") D.fopen("A:\user\abc.txt","w") 5.下列关于C语言数据文件的叙述中正确的是 A.文件由ASCII码字符序列组成,C语言只能读写文本文件 B.文件由二进制数据序列组成,C语言只能读写二进制文件 C.文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件 D.文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

C语言预处理命令的总结大全

C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C 语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令:#define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。 一#define 命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为: #define identifier string 注意: 1该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。 2宏名定义后,即可成为其它宏名定义中的一部分。 3 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如: #define XYZ this is a tes 使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识别出的是"XYZ" 4如果串长于一行,可以在该行末尾用一反斜杠' \'续行。 #defineLONG_STRING"this is a very long\ string that is used as an example" 5 C语言程序普遍使用大写字母定义标识符。 6 用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。 二#error 命令#error强迫编译程序停止编译,主要用于程序调试。

C语音编译预处理练习题

一、答案判断题:×√√××××√ 二、选择题: ADCBA DCDBB DDACB DDCC 一、判断题 1. C语言预编译命令#include与#include"myfile.h"的功能是完全一样的。() 2. 宏定义不是C语句,不必在行末加分号。() 3. C语言的编译系统对宏命令的处理是在对源程序中其他成份正式编译之前进行的。() 4. 若有宏定义:#define M(x,y,z)x*y+z,则宏引用M(2+3,4+5,6+7)通过宏展开后的表达式应为(2+3)*(4+5)+6+7。 5. #define与typedef的作用完全相同。() 6. 宏定义后一定要有分号。() 7. C语言的编译系统对宏命令的处理是在程序连接时进行的。() 8. 宏定义不是C语句,不必在行末加分号。() 二、单选题 1. 如果程序中有#include"文件名"则意味着()。 (A)将"文件名"所指的该文件的全部内容,复制插入到此命令行处。 (B)指定标准输入输出 (C)宏定义一个函数 (D)条件编译说明 2. 以下有关宏替换的叙述不正确的是()。 (A)宏替换不占用运行时间(B)宏名无类型 (C)宏替换只是字符串替换;(D)宏替换是在运行时进行的 3. 如果有#define f(x,y)x+y及int a=2,b=3;则执行printf("%d",f(a,b)*f(a,b))后的值为()。 (A)36(B)25(C)11(D)13 4. 若#include后面的文件名用双引号括起来,寻找被包含文件的方式是()。

A)先按系统设定的标准方式查找,再在当前目录中查找 B)先在当前目录中查找,再按系统设定的标准方式查找 C)只在当前目录中查找 D)只按系统设定的标准方式查找 5. 若程序中有#include"文件名",则意味着()。 A)将所指文件的全部内容,在次命令行出现的这一点上,插入原程序 B)指定标准输入输出C)宏定义一个函数D)条件编译说明 6. 在宏定义#define PI 3.1415926中,用宏名PI代替一个() A)单精度数B)双精度数C)常量D)字符串 7. 执行下面的程序 #define SQR(X)X*X main() {int a=10,k=2,m=1; a/=SQR(k+m)/SQR(k+m); printf("%d\n",a);} 后,a的值是()。 (A)10(B)9(C)1(D)0 8. 下面程序的输出结果是() #include"stdio.h" #define SUB(x,y)(x)*y main() {int a=3,b=4;printf("%d\n",SUB(a,b+1));} A)12B)16C)15D)13 9. 以下程序运行后,输出结果是()。 #include"stdio.h" #define PT 5.5 #define s(x)pt*x*x main( ) {int a=1,b=2; print(“%4.lf\n”,S(a+b));} A)49.5B)9.5C)22.0D)45.0 10. 下列程序执行后的输出结果是()。 #define MA(x)x*(x-1) main() {int a=1,b=2; printf("%d\n",MA(1+a+b));} A)6B)8C)10D)12

3分钟弄懂c语言预处理

3分钟弄懂c语言处预处理 朱有鹏 1、预处理详解 1.1、c语言预处理的意义 编译器本身的主要目的是编译源代码,将C的源代码转化成.s的汇编代码。编译器聚焦核心功能后,剥离出的一部分非核心的功能由预处理器执行,预处理器可以轻松完成一些特殊任务,预处理器对程序源码进行一些预先处理,为后续编译打好基础后,再由编译器编译。预处理的意义就是使编译器实现功能变得更为专一。 1.2、预处理涉及的内容 (1)文件包含 (2)宏定义 (3)条件编译 (4)一些特殊的预处理关键字 预处理指令很多,例如#include(文件包含);#if#ifdef#ifndef #else#elif#endif(条件编译),#define宏的实现。 (5)去除程序注释 1.3、有关gcc编译来链接过程 (1)编译链接四个步骤的命令回顾 (1)预处理的命令实现:gcc-E*.c-o*.i (2)编译命令实现:gcc-S*.c-o*.s (3)汇编的命令实现:gcc-c*.c-o*.o (4)链接的命令实现:gcc*.o-o*.out (2)预处理举例 gcc编译时,通过设置一些编译参数,可以指定编译过程,譬如gcc xx.c-o xx可以指定可执行程序的名称(不指定名称是直接为a.out);譬如gcc xx.c-c -o xx.o可以指定只编译不连接,也可以生成.o的目标文件。 gcc-E xx.c-o xx.i可以只预处理。在平时的开发中,我们常用这样的方法来理解程序,帮助调试程序。 通过执行 gcc-E preprocess.c-o preprocess.i (只预处理不编译). preprocess.i typedef char*PCHAR int main(int argc,char*argv[]) { char*p3; char*p1,p2;

C语言编译预处理命令

编译预处理命令 文件包含: 把指定的文件插入到预处理命令行所在的位置并取代该命令行,即把指定的文件和当前的源程序文件连接成一个源文件。 #include<文件名> 在文件包含目录中去查找指定的文件,并将该文件添加到源文件中。 一个被包含的文件中可以含有文件包含命令来包含另一个文件。 #include“文件名” 命令中文件名的位置是当前源文件的位置,若在当前目录中未找到该文件,则再到“包含目录”中去查找。 宏 用一个标识符表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时对程序中所有出现的宏名用宏定义中的字符串去代换,这就是宏替换。它是由系统编译程序时自动完成的。 无参宏定义 #define 标识符字符串 如 #define PI 3.14 使用宏时要注意: (1)宏定义是用宏名来表示一个字符串,在宏展开时用字符串取代宏名。(2)宏定义不是变量定义或语句,在行末不能加分号,如果加上分号则分号也成为字符串的一部分。 (3)宏定义可以出现在程序的任何地方,其作用域是宏定义命令所在位置开始到源程序结束。如果要终止其作用域可使用#undef命令。 (4)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时将逐层替换。 (5)#define PI 3.1415926 #define AREA PI*y*y 有参宏定义 #define 宏名(形参表)字符串 对带参数的宏,在调用中不仅要进行宏展开,而且还要用实参去替换形参。 带参宏调用的语法格式如下: 宏名(实参表);

#define M(x) x+1 K=M(3); K=3+1 定义有参宏时要注意以下几点: (1)有参宏定义中,宏名和形参表之间不能有空格出现。 (2)在函数中,调用时要把实参的值赋给形参,进行“值传递”。而在带参宏调用中,只是符号替换,不存在值传递问题。 (3)宏定义中的形参只能是标识符,而宏调用中的实参可以是表达式。 宏替换中对实参表达式不做计算直接照原样替换,字符串内的形参通常用括号括起来以避免出错。 在使用宏时不仅要将形式参数用括号括起来,还应将其整体用括号括起来。 #define S(y) ((y)*(y)) 条件编译 条件编译可以按不同的条件去编译不同的程序段。 1#ifdef #ifdef 标识符 程序段1 #else 程序段2 #endif 功能:如果标识符已被#define定义过,则对程序段1进行编译,否则对程序段2进行编译。格式中的#else部分可以没有,即: #ifdef 标识符 程序段 #endif 2、#ifndef 语法格式如下: #ifndef 标识符 程序段1 #else 程序段2 #endif 功能与ifdef形式的功能正好相反。 3、#if 常量表达式 #if 常量表达式 程序段1 #else 程序段2 #endif 功能:如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译,因此可以使程序在不同条件下,完成不同的功能。 上面介绍的条件编译实现的逻辑也可以用条件语句来实现,但是用条件语句将会

C语言预处理命令之条件编译(ifdef,else,endif,if)

C语言预处理命令之条件编译(#ifd ef,#else,#endif,#if) 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令用途 #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 一、文件包含 #include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。 预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如: #defineAAA #include"t.c" #undefAAA #include"t.c" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /*my.h*/

C语言三种预处理功能

C语言三种预处理功能 1. 宏定义 2. 文件包含 3. 条件编译 伪指令(或预处理指令)定义: 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif 如果前#if条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写 #endif 结束一个#if……#else条件编译块 #error 停止编译并显示错误信息 特殊符号 预编译程序可以识别一些特殊的符号。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。 注意,是双下划线,而不是单下划线。 FILE包含当前程序文件名的字符串 LINE表示当前行号的整数 DATE包含当前日期的字符串 STDC如果编译器遵循ANSI C标准,它就是个非零值 TIME包含当前时间的字符串 //例 #include int main() { printf("Hello World!\n"); printf("%s\n",__FILE__); printf("%d\n",__LINE__); return 0; } 1. 宏定义 不带参数 宏定义又称为宏代换、宏替换,简称“宏”。预处理(预编译)工作也叫做宏展开:将宏名替换为字符串,即在对相关命令或语句的含义和功能作具体分析之前就要换。 格式: #define 标识符字符串 其中标识符就是所谓的符号常量,也称为“宏名”。

相关主题
相关文档
最新文档