前言

预处理:

1
2
3
4
5
#pragma once
#define xxx
#ifdef xxx
#else
#endif

诸如此类命令。


正文

ifdef

一般都出现在头文件。主要是为了防止重复。

1
2
3
#ifdef _HH_

#endif

像这样在头文件定义后,除非源文件有#define _HH_不然里面的内容是无效的。

1
2
3
4
5
#ifdef _HH_
...
#else
...
#endif

然后if与else配套传统,如果不存在,就还有一种结果。


ifndef

最早可能用过这种,#ifndef是"if not defined"的简写。

在特殊场合多次包含中,可能会这么用

1
2
3
4
5
6
#ifndef _HH_
#define _HH_
...
#else

#endif

该段代码意思是:如果_HH_没有被定义,则重定义_HH_,即执行语句2、语句3;如果_HH_已经被定义,则直接跳过语句2、语句3,直接执行语句4…

当然这种处理方式就可以不用老实呆在头文件里,你可以放到源文件去处理一些事情

1
2
3
4
5
#ifdef UNICODE
wchar_t a;
#else
char a;
#endif;

像这种提前预定义编码环境的时候就可以规范一下格式

二者的区别就在于项目属性里更改使用的字符环境是能看到#ifdef反馈的高亮情况。


if

1
2
3
4
5
6
#define VERSION 2
#if VERSION==2
void up();
#else
void down();
#endif

预处理的if虽然也能使用逻辑运算符,但是跟常规if相比,他毕竟是预处理的指令,不会被编译。
使用这种好处自然是针对项目开发时,没必要废弃旧版本,就有些人用老的,那么有些功能的实现就可能依赖老版本环境。


elif

这个跟上面的if配套的,就是elseif一样的操作

1
2
3
4
5
6
7
8
#define VERSION 2
#if VERSION==1
void up();
#elif VERSION==2
void stop();
#else
void down();
#endif

实际上也就是更精确控制,但是绝大部分下应该用不了这么多。
除此之外就是既然可以使用基本的逻辑表达式,所以相对的基本的加减去改变自然也行得通

1
2
3
4
5
6
7
8
#define VERSION 2
#if VERSION==1+2 // #if VERSION==1 || VERSION==3 。&&自然没问题
void up();
#elif VERSION==2
void stop();
#else
void down();
#endif

结语

预处理用的不多,但是要知道能配套使用,且配套使用的时候要形成闭环,不然又是个逻辑鬼才。