预编译详解

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

现在一般的高级编译器都会自动预处理这条指令。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值