#ifdef #if defined #ifndef和#if !defined区别

首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句

  #ifndef _MYHEADFILE_H
  #define _MYHEADFILE_H
  // .......语句......
  #endif // _MYHEADFILE_H
  为了避免同一个文件被include多次,我们常使用 #ifndef 进行判断,如果没有包含
  _MYHEADFILE_H , 则使用#define 来定义一个宏 _MYHEADFILE_H 

  说到这里,我们有必要提一个C语言中的预处理器,预处理器是一个小软件,它可以在编译前处理C程序,它的行为是由预处理指令控制的,预处理指令包含了以下内容:
  1,宏定义   #define
  2,文件包含 #include
  3,条件编译 #if
  #ifdef
  #ifndef
  #if defined
  #if !defined
  #elif
  #else
  #endif
  #undef
  
  下面我们来看看条件编译
  #if (comdition)
  {//语句##;}
  #endif
  如果(comdition)为真, 也就是逻辑1的话,编译下面的语句,如果(comdition)为假,即逻辑0,则不编译下面的语句。例子如下:
  #define DEBUG
  #if DEBUG
  Printf(“Value of i:%d\n”, i);
  Printf(“Value of j:%d\n”, j);
  #endif
  格式:
  #if  常量表达式
  常量表达式为0时,预处理器删除#if 和#endif中间的代码
  #if 会把没有定义过的标准符视做为0, 如果没有定义DEBUG, 则
  测试#if DEBUG 会失败,但#if !DEBUG会成功。
  可以用宏来定义文件名:
  #if define(IA32)
  #define CPU_FILE “ia32.h”
  #elif defined(IA64)
  #deifine CPU_FILE “ia64.h”
  #elif defined(AMD64)
  #define CPU_FILE “amd64.h”
  #endif
  #include CPU_FILE
  还可以取消已经定义的宏:
  #if defined VALUE              // 检验VALUE是否被定义 ,如果被定义
  #undef VALUE            // 解除语句定义
  #define VALUE 1000            //  重新定义VALUE 为1000
  #endif
  如果检验没有定义,可以这样写:
  #ifndef VALUE               // 如果VALUE没有被定义
  #define VALUE 1000          //  定义VALUE 为1000
  #endif
  以上所用的宏中:
  #undef为解除定义;
  #ifndef是if not defined的缩写,也可以写成#if !defined 即如果没有定义;
  #ifdef是if defined的缩写,也可以写成#if defined 即检查是否定义过;
  #ifdef 和 #if defined 的区别,#ifndef 与#if !defined 的区别相类似,都在于后者可以组成复杂的预编译条件,前者只判断单个宏是否定义,例如:
  #if defined(PERL_PACK_CAN_SHRIEKSIGN)
  /* v */ SIZE16,
  #else
  0,
  #endif
  #ifdef PERL_PACK_CAN_SHRIEKSIGN
  /* v */ SIZE16,
  #else
  0,
  #endif
  #ifdef是种简写,但不支持更复杂的表达式。
  #ifdef HAVE_MYHEADER
  # if VERSION > 3
  ...
  # endif
  #endif
  这种情况用
  #if defined(HAVE_MYHEADER) && VERSION > 3
  ...
  #endif
  更为合理

总结:

#ifdef只能判断单一的宏是否定义,而#if defined()可以组成复杂的判别条件;

对于单一的宏AAA来说,#ifdef AAA和#if defined(AAA)是完全相同的。

而要组成复杂的判别条件,用#if defined()就灵活方便了,比如:#if defined(AAA) && (BBB >= 10)

如果改用#ifdef则没法表示条件BBB>=10了。

猜你喜欢

转载自blog.csdn.net/wenlong_l/article/details/80739793