面试题
- 猜一下哪段代码会被
编译
进去,强调下是编译进去,不是执行
#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不仅关心
宏是否被定义
,而且关心
宏逻辑的真假
常见预编译指令总结
#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
参考链接
链接:https://www.jianshu.com/p/609ff54ec6a5