『壹』 C语言中条件编译的实例
条件编译命令最常见的形式为:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
其中#else部分也可以没有,即:
#ifdef
程序段1
#endif
这里的「程序段」可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。
『贰』 C语言中条件编译的作用
条件编译属于三种宏定义中的一种,条件指示符的最主要目的是防止头文件的重复包含和编译,例如:一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误
条件编译常用的有四个预处理命令:#if、#else、#elif、#endif。
#if指令的形式为:
#if常量表达式
代码块
#endif
#if后面的常量表达式为值,则编译它与#endif之间的代码,否则跳过这些代码。指令#endif标识一个#if块的结束。
#else被使用来标志#if的末尾和#else块的开始。这是必须的,因为任何#if仅有一个#endif与之关联。
#elif意指"else if",它形成一个if else if嵌套语句用于多种编译选择。#elif后面跟一个常量表达式,如果表达式是真,则编译其后的代码块,不对其他#elif表达式进行检测,否则顺序测试下一块。常见的形式如下:
形式1:
#ifdef标识符
/*程序段1*/
#else
/*程序段2*/
#endif
它的作用是当标识符已经由#define定义过了,则编译程序段1,否则编译程序段2,也可以使用简单形式
#ifdef标识符
/*程序段1*/
#endif
形式2:
#ifndef标识符
#define标识符
/*程序段1*/
#else
/*程序段2*/
#endif
它的作用是当标识符没有由#define定义过,则编译程序段1,否则编译程序段2 ,也可以使用简单形式
#ifndef标识符
#define标识符
/*程序段1*/
#endif
形式3:
#if表达式
/*程序段1*/
#else
*程序段2*/
#endif
它的作用是 当「表达式」值为真时编译程序段1。否则则编译程序段2,也可以使用简单形式
#if表达式
/*程序段1*/
#endif
形式4:
#if表达式1
/*程序段1*/
#elif表达式2
/*程序段2*/
............
#elif表达式n
/*程序段n*/
#endif
它的作用是当「表达式1」值为1时编译程序段1,表达式2的值为真是编译程序段2,否则依次顺序判断到表达式n。
最后,条件编译的条件是一个常量表达式,支持逻辑与&&和或||运算。以上四种形式的条件编译预处理结构都可以嵌套使用,
标识符: 在理论上来说可以是自由命名的,但每个头文件的这个标识符都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的「.」也变成下划线,如:stdio.h。
#ifndef_STDIO_H_
#define_STDIO_H_
/*程序段*/
#endif
『叄』 条件编译,ifdef条件,ifndef条件的区别是什么
一般情况下,源程序中所有行都参加编译。但是有时希望程序中一部分内容只在满足一定条件是才进行编译,也就是对这一部分内容指定编译的条件,也就出现了条件编译.
#ifdef 和 #ifndef 用法及意义其实跟判断语句if是一样的
但使用if语句目标程序长,因为所有语句都要进行编译,运行时间长,因为运行时要对if语句进行测试
,而采用条件编译,就可以减少编译语句,从而减少目标程序的长度,减少运行时间。
『肆』 如何实现条件编译
插入预编译宏命令,例如:
// 宏 条件
#ifdef __APPLE__
// 这里编译 苹果 的
#else
// 这里编译 其它 的
#endif
『伍』 条件编译问题
if语句是确定要编译的内容,在运行时判断,比如:
if(a>b)
printf("A大于B");
else
printf("A小于B");
条件编译可不是在运行阶段执行的,是为了某种需要(特别是跨平台的需要),只在编译器扫描源代码时,确定用哪一部分。
举个例子,比如,一般LINUX多线程程序叫做pthread_create,而WINDOWS启动多线程的程序是CreateThread,为了保证同一个程序可以跨平台运行,我们这样书写程序:
#ifdef WIN32 //如果是WINDOWS系统
#include <windows.h>
#define THREAD CreateThread
#else //如果是LINUX系统
#include <pthread.h>
#define THREAD pthread_create
#endif
『陆』 条件编译,该怎么处理
条件编译属于三种宏定义中的一种,条件指示符的最主要目的是防止头文件的重复包含和编译,例如:一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误
条件编译常用的有四个预处理命令:#if、#else、#elif、#endif。
#if指令的形式为:
#if 常量表达式
代码块
#endif
#if后面的常量表达式为值,则编译它与#endif之间的代码,否则跳过这些代码。指令#endif标识一个#if块的结束。
『柒』 条件语句和条件编译有何区别
条件语句和条件编译的区别是:条件语句是语句,需要对所有分支的语句块进行编译,在程序运行后根据条件是否成立决定是否执行条件语句后的程序段。而条件编译是预处理命令,它是在预处理阶段就完成的,如果不符合条件,那个程序段就不会被编译。
『捌』 条件编译的介绍
一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是「条件编译」(conditional compile)。条件编译语句排版时,需考虑以下三种位置:1)条件编译语句块与函数定义体之间不存在相互嵌套(主要在(.h)文件中);2)条件编译语句块嵌套在函数体之外(主要在(.c)文件中);3)条件编译语句嵌套在函数体内 (主要在(.c)文件中)。条件编译指令将决定哪些代码被编译,而哪些是不被编译的。可根据表达式的值或某个特定宏是否被定义来确定编译条件。
『玖』 C语言中条件编译有哪几种形式
预处理程序提供了条件编译的功能。 可以按不同的条件去编译
不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移
植和调试是很有用的。
条件编译有三种形式,下面分别介绍:
1. 第一种形式:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的功能是,如果标识符已被 #define命令定义过则对程序段1
进行编译;否则对程序段2进行编译。
如果没有程序段2(它为空),本格式中的#else可以没有, 即可
以写为:
#ifdef 标识符
程序段
#endif
#define NUM ok
main(){
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
#ifdef NUM
printf("Number=%d\nScore=%f\n",ps->num,ps->score);
#else
printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
#endif
free(ps);
}
由于在程序的第16行插入了条件编译预处理命令, 因此要根据
NUM是否被定义过来决定编译那一个printf语句。而在程序的第一行
已对NUM作过宏定义,因此应对第一个printf语句作编译故运行结果
是输出了学号和成绩。
在程序的第一行宏定义中,定义NUM表示字符串OK,其实也可以
为任何字符串,甚至不给出任何字符串,写为:
#define NUM
也具有同样的意义。 只有取消程序的第一行才会去编译第二个
printf语句。读者可上机试作。
2. 第二种形式:
#ifndef 标识符
程序段1
#else
程序段2
#endif
与第一种形式的区别是将「ifdef」改为「ifndef」。它的功能
是,如果标识符未被#define命令定义过则对程序段1进行编译, 否
则对程序段2进行编译。这与第一种形式的功能正相反。
3. 第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行
编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完
成不同的功能。
#define R 1
main(){
float c,r,s;
printf ("input a number: ");
scanf("%f",&c);
#if R
r=3.14159*c*c;
printf("area of round is: %f\n",r);
#else
s=c*c;
printf("area of square is: %f\n",s);
#endif
}
本例中采用了第三种形式的条件编译。在程序第一行宏定义中,
定义R为1,因此在条件编译时,常量表达式的值为真, 故计算并输
出圆面积。
上面介绍的条件编译当然也可以用条件语句来实现。 但是用条
件语句将会对整个源程序进行编译,生成的目标代码程序很长, 而
采用条件编译,则根据条件只编译其中的程序段1或程序段2, 生成
的目标程序较短。如果条件选择的程序段很长, 采用条件编译的方
法是十分必要的。
本章小结
1. 预处理功能是C语言特有的功能,它是在对源程序正式编译前由
预处理程序完成的。程序员在程序中用预处理命令来调用这些功
能。
2. 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常
量、变量或表达式。在宏调用中将用该字符串代换宏名。
3. 宏定义可以带有参数,宏调用时是以实参代换形参。而不是「值
传送」。
4. 为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符
串中出现的形式参数两边也应加括号。
5. 文件包含是预处理的一个重要功能,它可用来把多个源文件连接
成一个源文件进行编译,结果将生成一个目标文件。
6. 条件编译允许只编译源程序中满足条件的程序段,使生成的目标
程序较短,从而减少了内存的开销并提高了程序的效率。
7. 使用预处理功能便于程序的修改、阅读、移植和调试,也便于实
现模块化程序设计。
『拾』 c中条件编译的问题
嘿嘿!你的错误应该是这个constant expression require!
简单一点对你说,#if后面不可以接变量表达式!
因为条件编译就是根据你不同的条件来编译你程序中的不同部分!
所谓条件是指需要在计算机编译时确定的,但你一定有听老师讲过变量表达式
只是在程序执行时充当作用!
如果你将AMD改为常量表达式!程序一定没有错!
