面试题
- 猜一下哪段代码会被
编译
进去,强调下是编译进去,不是执行
#define XXX 0
// 第一段条件编译
#ifdef XXX
逻辑1
#else
逻辑2
#endif
// 第二段条件编译
#if XXX
逻辑1
#else
逻辑2
#endif
- 答案
- 第一段条件编译:
逻辑1
会被编译进去
- 第二段条件编译:
逻辑2
会被编译进去
总结
-
#if
既关心宏是否定义,又关心宏的逻辑的真假
-
#ifdef(#if defined())、#ifndef(#if !defined())
仅仅关心宏是否被定义,不关心宏的逻辑真假
#ifdef
#ifdef 宏
逻辑1
#else
逻辑2
#endif
-
#ifdef只关心
宏是否被定义
,不关心
宏逻辑的真假
- 举例:
#define 宏 1
和 #define 宏 0
等效,都等同于 #define 宏
#if
#if 宏
逻辑1
#else
逻辑2
#endif
常见预编译指令总结
-
#if、#elif、#else、#endif
使用示例
#if 条件1
代码段1
#elif 条件2
代码段2
.
.
.
#elif 条件n
代码段n
#else
代码段 n+1
#endif
-
#ifdef、#ifndef、#else、#endif
使用示例
// 如果定义了macro_name宏就编译代码段1
#ifdef macro_name
代码段1
#else
代码段2
#endif
// 等价于上面的条件编译指令,如果未定义macro_name宏,就编译代码段1
#ifndef macro_name
代码段2
#else
代码段1
#endif
-
#if defined()
和 #ifdef
的比较
#ifdef MACRO_1
#ifdef MACRO_2
代码段A
#endif
#endif
// 等价于上面的条件编译指令
#if defined(MACRO_1) && defined(MACRO_2)
代码段A
#endif
-
#if !defined()
和 #ifndef
的使用同上
强调两点
- 这几个宏定义只是决定代码块
是否被编译
- 别忘了
#endif
参考链接