2016-10-19 2 views
-1
#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.Путаница с #ifndef и #ifdef

И второй случай, когда снова R определяется опять он не должен быть в состоянии определить N2 как 11 , потому что R уже определен. Я просто смущен, и можно, пожалуйста, помочь понять, что я пропустил.

+6

Почему, по вашему мнению, 'R' определяется во втором' # ifndef'? – tkausl

+0

@tkausl потому что #endif не достигнут yeat –

+2

где '#define R'? –

ответ

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 отрасли.

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 
Смежные вопросы