### 条件编译指令
- 条件编译指令就是有条件地编译,当满足某条件时,对一组语句进行编译,当条件不足时编译另一组语句。
#### #if指令
**#if指令一般与#else和#elseif指令组合使用格式为:**
#if 表达式
程序段
#else
程序段2
#endif
由于条件编译指令是在预处理阶段执行的,因此表达式必须为宏表达式:
#include <stdio.h>
#define NUM 'c'
int main()
{
#if NUM=='e'
printf("The treasure of pirate is buried under your bed.\n");
#else
printf("海盗的宝藏就埋在你床下。\n");
#endif
return 0;
}
#### 注意:关于#if……#else……#endif的注意有2点
- #if要对表达式的值进行判断,因此不能仅定义宏而不给出宏体,要给出宏所代表的值
- 条件编译#if……#else……#endif与条件语句if……else功能虽然相同,但是两者时间开销不同,条件编译只编译满足条件的程序段,可以有效地减少被编译的语句,从而缩短源代码的长度,进而达到缩短程序执行时间的目的,条件语句不能减少被编译的语句,因此无法缩短程序的执行时间
#### #elif指令 ####
**#elif和else if相似,只是编译时不同,对于else if 来说,无论它所检测的条件是否满足,该条件对应的语句都会被编译,但是对于#elif来说,当给定条件不满足时,该条件对应的语句不会被编译**
#include <stdio.h>
#define WORD 'c'
int main()
{
#if WORD=='e'
printf("I love you.\n");
#elif WORD=='d'
printf("Ich liebe Dich.\n");
#elif WORD=='f'
printf("Je t'aime.\n");
#else
printf("ÎÒ°®Äã¡£\n");
#endif//用于结束条件编译
return 0;
}
#### #ifdef指令
**该指令检测的不是宏代表的值,而是宏是否被定义**
~~~
#include <stdio.h>
#define MOD
int main()
{
#ifdef MOD//检测一个宏是否被定义
printf("MOD被定义。\n");
#endif
printf("程序结束。\n");
return 0;
}
~~~
#### #ifndef的应用 ####
**#ifndef可以防止重复定义**
重复定义:如果将一个book.h在一个源文件中包含2次,则book结构类型就被定义了2次。
如果main.c文件中包含了book.h和goods.h,而goods.h中又包含了book.h则main.c中就包含了两次book.h。为了解决这种由重复而造成的重复定义需要将book.h修改一下
如下所示:
book.h内容如下:
#ifndef BOOK //假如没有定义BOOK
#define BOOK //定义BOOK
struct book //定义book结构类型
{
char name[10];
double price;
};
#endif//结束条件编译
goods.h内容如下:
#ifndef BOOK //假如没有定义BOOK
#define BOOK //定义BOOK
#include "goods.h"
struct goods //定义book结构类型
{
char name[10];
double price;
};
#endif//结束条件编译
main.c内容如下:
#include <stdio.h>
#include "book.h"
#include "goods.h"
int main()
{
struct book Wild={"教父",42.00};
printf("%-12s%-12s\n","书名","价格");
printf("%-12s%-12.2f\n",Wild.name,Wild.price);
return 0;
}
这样就不会出现重复定义
- 前言
- JNI基础知识
- C语言知识点总结
- ①基本语法
- ②数据类型
- 枚举类型
- 自定义类型(类型定义)
- ③格式化输入输出
- printf函数
- scanf函数
- 编程规范
- ④变量和常量
- 局部变量和外部变量
- ⑤类型转换
- ⑥运算符
- ⑦结构语句
- 1、分支结构(选择语句)
- 2、循环结构
- 退出循环
- break语句
- continue语句
- goto语句
- ⑧函数
- 函数的定义和调用
- 参数
- 函数的返回值
- 递归函数
- 零起点学通C语言摘要
- 内部函数和外部函数
- 变量存储类别
- ⑨数组
- 指针
- 结构体
- 联合体(共用体)
- 预处理器
- 预处理器的工作原理
- 预处理指令
- 宏定义
- 简单的宏
- 带参数的宏
- 预定义宏
- 文件包含
- 条件编译
- 内存中的数据
- C语言读文件和写文件
- JNI知识点总结
- 前情回顾
- JNI规范
- jni开发
- jni开发中常见的错误
- JNI实战演练
- C++(CPP)在Android开发中的应用
- 掘金网友总结的音视频开发知识
- 音视频学习一、C 语言入门
- 1.程序结构
- 2. 基本语法
- 3. 数据类型
- 4. 变量
- 5. 常量
- 6. 存储类型关键字
- 7. 运算符
- 8. 判断
- 9. 循环
- 10. 函数
- 11. 作用域规则
- 12. 数组
- 13. 枚举
- 14. 指针
- 15. 函数指针与回调函数
- 16. 字符串
- 17. 结构体
- 18. 共用体
- 19. typedef
- 20. 输入 & 输出
- 21.文件读写
- 22. 预处理器
- 23.头文件
- 24. 强制类型转换
- 25. 错误处理
- 26. 递归
- 27. 可变参数
- 28. 内存管理
- 29. 命令行参数
- 总结
- 音视频学习二 、C++ 语言入门
- 1. 基本语法
- 2. C++ 关键字
- 3. 数据类型
- 4. 变量类型
- 5. 变量作用域
- 6. 常量
- 7. 修饰符类型
- 8. 存储类
- 9. 运算符
- 10. 循环
- 11. 判断
- 12. 函数
- 13. 数学运算
- 14. 数组
- 15. 字符串
- 16. 指针
- 17. 引用
- 18. 日期 & 时间
- 19. 输入输出
- 20. 数据结构
- 21. 类 & 对象
- 22. 继承
- 23. 重载运算符和重载函数
- 24. 多态
- 25. 数据封装
- 26. 接口(抽象类)
- 27. 文件和流
- 28. 异常处理
- 29. 动态内存
- 30. 命名空间
- 31. 预处理器
- 32. 多线程
- 总结
- 音视频学习 (三) JNI 从入门到掌握
- 音视频学习 (四) 交叉编译动态库、静态库的入门学习
- 音视频学习 (五) Shell 脚本入门
- 音视频学习 (六) 一键编译 32/64 位 FFmpeg 4.2.2
- 音视频学习 (七) 掌握音频基础知识并使用 AudioTrack、OpenSL ES 渲染 PCM 数据
- 音视频学习 (八) 掌握视频基础知识并使用 OpenGL ES 2.0 渲染 YUV 数据
- 音视频学习 (九) 从 0 ~ 1 开发一款 Android 端播放器(支持多协议网络拉流/本地文件)
- 音视频学习 (十) 基于 Nginx 搭建(rtmp、http)直播服务器
- 音视频学习 (十一) Android 端实现 rtmp 推流
- 音视频学习 (十二) 基于 FFmpeg + OpenSLES 实现音频万能播放器
- 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)