C语言 16-预处理指令2-条件编译

本文目录

  • 条件编译的概念
  • 一、基本用法
  • 二、举个例子
  • 三、其他用法

  说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略。

上一篇已经介绍了预处理指令中的宏定义,这篇就介绍一下条件编译

条件编译的概念

在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译

一、基本用法

1 #if 条件1
2  ...code1...
3 #elif 条件2
4  ...code2...
5 #else
6  ...code3...
7 #endif

1> 如果条件1成立,那么编译器就会把#if 与 #elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)
2> 如果条件1不成立、条件2成立,那么编译器就会把#elif 与 #else之间的code2代码编译进去

3> 如果条件1、2都不成立,那么编译器就会把#else 与 #endif之间的code3编译进去

4> 注意,条件编译结束后,要在最后面加一个#endif,不然后果很严重(自己思考一下后果)

5> #if 和 #elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时才产生的、才有使用的意义

二、举个例子

 1 #include <stdio.h>
 2
 3 #define MAX 11
 4
 5 int main ()
 6 {
 7 #if MAX == 0
 8     printf("MAX是0");
 9 #elif MAX > 0
10     printf("MAX大于0");
11 #else
12     printf("MAX小于0");
13 #endif
14     return 0;
15 }

在第3行定义了一个宏MAX,当然在开发中这个MAX可能被定义在其他头文件中,现在只是为了方便演示,就写到main函数上面了。注意第7到第13行的条件编译语句。
由于MAX为11,所以#elif的条件成立,第10行代码将会被编译进去,其实编译预处理后的代码是这样的:

1 /*stdio.h文件中的内容将会代替#include <stdio.h>的位置*/
2
3 int main ()
4 {
5     printf("MAX大于0");
6     return 0;
7 }

代码变得非常简洁,输出结果:

三、其他用法

1.#if defined()和#if !defined()的用法

#if 和 #elif后面的条件不仅仅可以用来判断宏的值,还可以判断是否定义过某个宏。比如:

1 #if defined(MAX)
2     ...code...
3 #endif

如果前面已经定义过MAX这个宏,就将code编译进去。它不会管MAX的值是多少,只要定义过MAX,条件就成立。

条件也可以取反:

1 #if !defined(MAX)
2     ...code...
3 #endif

如果前面没有定义过MAX这个宏,就将code编译进去。

2.#ifdef和#ifndef的使用

* #ifdef的使用和#if defined()的用法基本一致

1 #ifdef MAX
2     ...code...
3 #endif

如果前面已经定义过MAX这个宏,就将code编译进去。

* #ifndef又和#if !defined()的用法基本一致

1 #ifndef MAX
2     ...code...
3 #endif

如果前面没有定义过MAX这个宏,就将code编译进去。

时间: 2024-10-23 14:55:08

C语言 16-预处理指令2-条件编译的相关文章

从头开始-06.C语言中预处理指令

预处理指令 不带参数的宏定义: 格式: #define 宏名 值 作用:提高代码的可读性 在程序编译前把所有出现宏名标示的位置都替换为定义宏的时候,宏名后面的值 带参数的宏定义 格式 #define 宏名(参数列表) 参数表达式 作用:在编译之前,把所有出现宏名(x)地方,都替换成把 参数代入参数表达 我写带参数的宏定义的时候,需要把每一个参数和结果都使用()扩起来 条件编译: 格式: #if #elif #else #endif 作用:当条件满足的时候就编译它后的语句 注意点:条件编译必须以#

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----04 预处理指令

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的

C语言三)预处理指令

一.预处理指令 1.定义 C语言在对源程序进行编译之前,会先对一些特殊的预处理指令做解释,如:#include,产生一个新的源程序,这个过程称为"编译预处理",之后再进行通常的编译工作. 2.作用范围 预处理指令可以出现在程序的任意位置,它的作用范围是从它出现的位置到文件末尾.习惯上,我们把预处理指令写在源程序开头. 3.类型 C语言提供了预处理指令主要有:宏定义.文件包含和条件编译. 二.不带参数的宏定义 1.一般形式 #define 宏名 字符串 如:#define A 10; /

C/C++预处理指令#define,条件编译#ifdefine

本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if--#else条件编译块 #error停止编译并显示错误信息 条件编译命令最常见的形式为: #ifdef

预处理指令(条件编译)

条件编译的概念 •在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译. 一.基本用法 #if 条件1 ...code1... #elif 条件2 ...code2... #else ...code3... #endif •1>如果条件1成立,那么编译器就会把#if 与 #elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)?2> 如果条件1不成立.条件2成

C语言学习入门 (六) 预处理指令:宏、条件编译、文件包含

预处理指令 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令), 产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾. 习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件 不带参数的宏定义 #define 宏

《黑马程序员》预处理指令(宏定义、条件编译、文件包含)(C语言)

宏定义的基本概念 ●  预处理指令都是以#开头 ●  预处理指令分为三种 1.宏定义 定义格式:#define  宏名   参数 2.条件编译 #if 条件语句     statement1; #elif 条件语句     statement2; #else     statement3; #endif       //条件编译结束必须加上此条语句,否则statement3以下的所有语句都将默认为不编译 3.文件包含 ●  预处理指令在代码翻译成0和1之前进行 ●  预处理指令的位置是可以写的

C语言-1.结构体,2.枚举,3.typedef,4.预处理指令的概念,5.条件编译

1. 结构体数组 定义:由若干个相同类型的结构体变量组成的有序的集合. 定义格式: 1) 定义结构体的同时定义结构体数组 struct Car{ int lunzi; int speed; }cars[5]; 2) 使用匿名结构体定义数组 struct { int lunzi; int speed; }cars[5]; 3)先定义结构体,再定义结构体数组 struct Car cars[5]; 初始化: 1) 定义结构体数组的同时进行初始化 struct Car{ int lunzi; int

黑马程序员--C语言--预处理指令、枚举、Typedef、递归函数、变量作用域

一.预处理指令 1>所有的预处理指令都是以#号开头; 2>预处理指令是在代码翻译成0,1之前执行: 3>预处理指令最后没有分号: 4>预处理指令的位置可以随便写: 5>预处理指令有作用域,从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用: 预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含 二.宏定义 1. 宏定义命名规则: 1>大写字母 1 #define COUNT 2>k开头首字母大写 #define 

黑马程序员————C语言(预处理指令、static与extern、typedef)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲  预处理指令 预处理指令的概述 C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释,比如之前使用的#include文件包含指令,产生一个新的源程序,这个过程称为编译预处理,之后再进行通常的编译 为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾.习惯上我们尽