C语言学习笔记(11)
1. 条件编译
条件编译是指预处理根据测试的结果来包含或排除程序的片段。
2. #if和#endif
也不多说,举个例子就懂了。
#define DEBUG 1 int main (void) { #if DEBUG printf("Hello world"); #endif return 0; }
其实效果就是类似于这样的代码:
int main (void) { int debug=1; if(debug) printf("Hello world"); return 0; }
不同的是:预处理命令是由预处理器来处理。#if指令会测试DEBUG的值,如果DEBUG的值是0,那么这个printf就不会保存在目标程序中占用空间,也不会消耗程序的运行时时间。因此,我们在测试时可以将这段代码保存到最终代码中。
3. 一些相似的条件编译符号
defined运算符通常与#if联合使用,来判断某宏定义是否被定义。
#define DEBUG 1 int main (void) { #if defined DEBUG printf("Hello world"); #endif return 0; }
与其同样语义的还可以这样来写:
#define DEBUG 1 int main (void) { #ifdef DEBUG printf("Hello world"); #endif return 0; }
当然,还有#ifndef代表if not defined的语义。
#elif:else if
#else。
这些都是可以与#if配合使用的,和一般的条件判断语义一样。不再重复举例子。
4. 条件编译的用处
A. 调试。
B. 编写不同操作系统,不同平台,不同编译器使用的程序。
例如:
#define WINDOWS int main (void) { #if defined WINDOWS printf("WINDOWS"); #elif defined LINUX printf("LINUX"); #else printf("ELSE"); #endif return 0; }
C. 临时屏蔽代码
5. #error指令
遇到#error意味着遇到了比较严重的错误,编译器会立即终止程序,例如:
int main (void) { #if defined WINDOWS printf("WINDOWS"); #elif defined LINUX printf("LINUX"); #else #error Not Support #endif return 0; }6. 托管式实现和独立式实现
这是一个基础的概念。
大部分程序都是托管式实现,这些程序都需要底层的操作系统来提供输入输出以及其他的一些基本服务,而C的独立式实现用于不需要操作系统的程序。
一般来说,独立式程序用于编写操作系统内核以及嵌入式程序。