1.#undef
这条指令用于移除一个宏定义。
eg.
#undef NAME
实际用法:
#define M 50//定义了M为50
int main()
{
#undef M//再次undef M
printf("%d", M);
}
编译器会报错,因为M被undef移除了,所以之前define的M无效
2.条件编译
这里的条件预编译类似于我们写代码时用的if else if之类的条件语句
常见的条件编译指令有:
1.
#if 常量表达式
//...
#endif
//常量表达式由预处理器求值。
2.多个分支的条件编译
#if 常量表达式
//...
#elif 常量表达式
//...
#else
//...
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
接下来详细解释一下各指令的用法,因为在实际工作中,这些指令其实很常用,需要掌握。
2.1
#if 常量表达式
//...
#endif
这个很简单,if如果判断为真,就执行#if与#endif之间的所有语句。
例子:
int main()
{
#if 1 /1为真,所以执行#if和#endif之间的所有语句
printf("1");
#endif
}
但是注意!!!
int main()
{
int M = 1;
#if M
printf("1");
#endif
}
你认为这样程序能执行吗?
答案是不会:即使M=1,但是#if语句后面只能放常量表达式,究其深层原因,因为#if是预编译阶段就处理了,而M变量的定义在其之后,所以在处理#if的时候,编译器并看不到M的定义,所以编译器会报错
2.2
2.多个分支的条件编译
#if 常量表达式
//...
#elif 常量表达式
//...
#else
//...
#endif
这个指令其实你弄懂2.1的指令之后自然就懂了,只是在 #if #endif 的基础上多了一个分支:#elif,原理和if else if一样。
2.3
3.判断是否被定义
#if defined(symbol) /symbol是否被定义
#ifdef symbol /symbol是否被定义
#if !defined(symbol) /symbol是否未被定义
#ifndef symbol /可展开看成if no define,意味着symbol是否违被定义
结合上面的条件指令,就懂得了如何使用
条件编译可以解决一个常见问题:
检查头文件是否被包含过,如果你了解过,就知道你每次写一次#include <头文件>,编译器在预编译阶段就会把头文件展开写入,你多写一次,它就多展开一次,这无疑十分浪费时间,所以我们用上面的条件指令来判断。
每个文件开头写
#ifndef __TEST_H__ /__TEST_H__是否未被定义
#define __TEST_H__ /如果未被定义就执行该条指令
//头文件的内容
#endif //__TEST_H__
或者
#pragma once
现在一般的高级编译器都会自动预处理这条指令。