执行 C 程序的第一步是 预编译,所有预编译指令以#
开头,例如#include
, #define
等。预编译阶段需要做的就是对代码进行一个整理,搬运(include)、删减(条件编译)等。
条件编译:根据不同的情况编译不同的代码,在预编译阶段完成。条件编译与条件语句不同,条件语句始终是要编译的一部分,而条件编译则是根据条件在预编译阶段就删掉了一些语句。与条件编译相关的预处理命令有:#if
, #elif
, #else
, #endif
以及专门用于检测宏的#ifdef
和#ifndef
。
#if
if ... elif ... else ... endif 是通用的条件编译四件套:
#if EXPR1
BLOCK1;
#elif EXPR2
BLOCK2;
#else
BLOCK3;
#endif
其中 EXPR 必须是 整型常量表达式,一般都是#define
定义的宏,或者基于宏的简单表达式,例如
#define N 10
#if N == 10
//...
#else
//...
#endif
布尔值也能被#if
指令检测,因为它能显式转换为整型(0或者1)。
再例如 Windows 定义了宏_WIN32
,而 Linux 定义了宏__linux__
,所以系统检测不能通过条件语句进行,因为在一个系统中势必会导致另一个系统的宏没有定义。正确的检测是使用条件编译:
#include <stdio.h>
#if _WIN32
printf("this is windows");
#elif __linux__
printf("this is linux");
#else
printf("I don't know your os");
#endif
#ifdef
#ifdef
用来检测某个 宏 是否被定义,相当于 if define 的简写。
只能用来检测宏是否被定义,而不能用来检测宏的值。
#include <stdio.h>
#ifdef _WIN32
printf("this is windows");
#else
printf("I don't know your os");
#endif
检测宏的值还是得用#if
:
#define N 10
#if N == 10
//...
#endif
如果是需要在某个宏未定义时保留某段代码,使用#ifndef
即可。
评论区