侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

预编译:条件编译

barwe
2022-07-22 / 0 评论 / 0 点赞 / 1,009 阅读 / 951 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

执行 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即可。

0

评论区