与#ifndef和#ifdef混淆

时间:2016-10-19 21:31:03

标签: c++

#include <iostream>
using namespace std;

#ifndef R
   #define N1 10

   #ifndef R
      #define N2 11
   #endif


#endif

int main(){
    cout << N2 << endl;
}

根据我的理解,如果R未定义,则N1将为10。

再次定义R的第二种情况,它不应该将N2定义为11,因为R已经定义。我只是对此感到困惑,我可以帮助理解我错过的观点。

2 个答案:

答案 0 :(得分:0)

第二个#ifndef是您目前组织的方式的冗余。我会用更清晰的伪代码写出来

IF R IS NOT DEFINED
  SET N1 = 10
  IF R IS NOT DEFINED
    SET N2 = 11
  END IF
END IF

这可以更简单

IF R IS NOT DEFINED
  SET N1 = 10
  SET N2 = 11
END IF

或在C / C ++预处理程序表示法中

#ifndef R
#define N1 10
#define N2 11
#endif

答案 1 :(得分:0)

让我们来看看代码:

#ifndef R

R尚未定义,因此请进入分支:

   #define N1 10

N1变为10

   #ifndef R

R尚未定义,因此请进入嵌套分支

      #define N2 11

N2被分配到11

   #endif

结束嵌套分支

#endif

结束主要分支

所以最后R从未定义,所以我们成功分配了N2

您需要在编译器行中显式#define R或使用-DR来定义R,它不会在ifndef R分支中为您定义。