c语言提供的预处理功能包括条件编译(简单C语言问题求解答)

本文目录
简单C语言问题求解答
答案c
预处理功能主要有以下三种:宏定义、文件包含和条件编译,所以A不正确。预处理不是C语句,所以B不正确。预处理命令是由ANSIC统―规定的,编译程序不能识别它们,D也不正确。
一些语句前面有#号什么意思
’#’表示这是一条预处理指令
ANSI 标准定义的C语言预处理程序包括下列命令:
# d e f i n e
# e r r o r
# i n c l u d e
# i f
# e l s e
# e l i f
# e n d i f
# i f d e f
# i f n d e f
# u n d e f
# l i n e
# p r a g m a
非常明显,所有预处理命令均以符号#开头,
C提供的预处理功能有三种:
1、 宏定义
2、 文件包含
3、 条件编译
9.1 宏定义#define
9.1.1 不带参数的宏定义
用一个指定的标识符(即名字)来代表一个字符串,一般形式为:
#define 标识符 字符串
例:#define PI 3.1415926
目的:用PI代替字符串3.1415926,以后在编译时,凡程序中出现的所有的PI都用“3.1415926”代替。
意义:可以用来一个简单的字符串代替一个长的字符串或者数字。
说明:
1、 宏名习惯用大写
2、 宏定义是用宏名代替一个字符串,不作正确性检查。
3、 宏定义不是C语句,不在行末加;
4、 #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常写在文件开头。
5、 可以用#undef命令终止宏定义的作用域。
6、 可以层层置换。
例:#define R 3.0
#define PI 3.1415926
#define L 2*PI*R
7、 对程序内用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
9.1.2 带参数的宏定义
#define 宏名(参数表) 字符串
字符串中包含在括弧中的所指定的参数。宏名可以取参量。每次遇到宏名时,与之相连的形参均由程序中的实参代替。
#define MIN(a,b) (a《b) ? a : b
m a i n ( )
{
int x, y;
x = 10;
y = 20;
printf("the minimum is: %d" ,M I N ( x ,y ) ) ;
}
如:#define S(a,b) a*b
area=S(3,2);
与函数调用的区别:
1)、函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏定义只是进行简单的字符替换。
2)、函数调用是在程序运行时处理的,分配临时的内存单元。宏展开是在编译时进行的,没有值传递,也没有“返回值”的概念。
3)、对函数中的实参和形参都要定义类型,二者的类型要一致,如不一致,要进行类型转换。而宏不存在类型,宏名无类型,宏定义时,字符串可以是任何类型的数据。
#define CHAR1 CHINA (字符)
#define a 3.6 (数据)
4)、调用函数只可得到一个返回值,而用宏可以设法得到几个结果。
5)、可用#undef终止宏定义的作用域。
例如:
# define LEN 100
#difine WIDTH 100
char array;
# undef LEN
# undef WIDTH
/ *at this point both LEN and WIDTH are undefined * /
直到遇到#undef 语句之前, L E N与W I D T H均有定义。
# undef 的主要目的是将宏名局限在仅需要它们的代码段中。
9.2 “文件包含”处理
一般形式:
#include "stdio.h"
#include 《stdio.h》
注意:
1、 一个include命令只能指定一个被包含文件,如果要包含n个文件,要用n个include命令。
2、 如果文件1包含文件2,文件2包含文件3的内容,则可在文件中使用两个include命令分别包含文件2和文件3,而且文件3应出现在文件2之前,即在file1.c中定义:
#include “file3.h”
#include “file2.h”
3包含可以嵌陶
4、可以有如下两种方式:
#include "stdio.h"
#include 《stdio.h》
尖括号表示系统到存放C库函数头文件所在的目录中寻找要包含的文件;双引号表示系统先在用户当前目录中寻找要包含的文件,如果找不到,在按尖括号的方式查找。
一般来说,库函数的包含文件用尖括号的形式,而用户自定义的函数用双引号的形式。
5、被包含文件与其所在的文件在预编译后形成一个文件。
9.3条件编译
对程序源代码的各部分有选择地进行编译,该过程称为条件编译。
有如下几种方式:
1、#ifdef 标识符
程序段1
#else
程序段2
#endif
意义:当指定的标识符已经被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。#else可没有。
如:
#ifdef 标识符
程序段1
#endif
例:
#define TED 10
main ()
{
#ifdef TED
printf("Hi Ted\n");
# e l s e
printf("Hi anyone\n");
# e n d i f
}
上述代码打印“ Hi Ted ”及“ RALPH not defined”。如果T E D没有定义,则显示“ H i
a n y o n e”
2、#ifndef 标识符
程序段1
#else
程序段2
#endif
意义:当指定的标识符未被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。#else可没有。
3、#if 标识符
程序段1
#else
程序段2
#endif
意义:当表达式为真,就执行程序段1;否则执行程序段2
例:
# define MAX 100
main( )
{
# if MAX》99
printf("compiled for array greater than 99\n") ;
# endif
}
注意:跟在# if 后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符s i z e o f。# else 命令的功能有点象C语言中的e l s e; # e l s e建立另一选择(在# if失败的情况下)。
21. (1.5分) 下列叙述中正确的是( ) (A) C语言的预处理功能是
答案是:C
A 不对。
C语言的预处理功能包括:1.宏定义 2.文件包含 还有3.条件编译 等
B 不对。
宏定义和文件包含指令只要在函数代码使用宏或调用包含文件中的变量、函数之前写好,一般在文件首部;但条件编译指令通常在代码中间;其它指令也不需在首部。
C 正确。
D 不对。
C语言的编译预处理内容不只是全部语法检查,还有语义检查, 生成目标代码.obj等工作。
所以,答案是C

更多文章:
blast premier春季赛(csgo战队vitality有谁)
2026年9月7日 21:50
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00





