Путаница с макросом ОТЛАДКИ

#c #macros

#c #макросы

Вопрос:

test.cpp

 #include <iostream>
#include "Class1.h"
#define DEBUG

int main() {
    checkAssert();
}
  

Class1.h

 #include <cassert>

#ifndef CLASS1_H_
#define CLASS1_H_

#if defined(DEBUG)

void checkAssert(){
    int number = 10;
    assert(number == 10);
}


#else

void checkAssert(){
    std::cout << "opps" << std::endl;
}

#endif /* DEBUG */
#endif /* CLASS1_H_ */
  

1. Я определил DEBUG в основном файле.

2.In Class1.h #, если определено (DEBUG), предназначен для проверки, определена ли DEBUG или нет (в соответствии с моим пониманием).

Я пытаюсь использовать эту программу, чтобы понять, как работает отладочный макрос на c , но каждый раз, когда у меня на экране появляется вывод opps. Может кто-нибудь, пожалуйста, помочь мне понять, что происходит.

Ответ №1:

Вы test.cpp устанавливаете макрос после того, как файл заголовка уже включен. Слишком поздно. Вы должны установить макрос перед включением файла заголовка:

 #define DEBUG
#include <Class1.h>
  

Комментарии:

1. @RashedAzad, если это отвечает на ваш вопрос (что, я полагаю, так и есть), тогда вы должны отметить этот ответ правильным.

Ответ №2:

Препроцессор выполняет подстановку текста. Как только он вставляется class1.h в файл вашего TU, у вас есть (я проигнорировал расширение стандартных заголовков для краткости)

 #include <iostream>

#include <cassert>

#ifndef CLASS1_H_
#define CLASS1_H_

#if defined(DEBUG)

void checkAssert(){
    int number = 10;
    assert(number == 10);
}


#else

void checkAssert(){
    std::cout << "opps" << std::endl;
}

#endif /* DEBUG */
#endif /* CLASS1_H_ */

#define DEBUG

int main() {
    checkAssert();
}
  

Как вы можете видеть, DEBUG определяется после проверки на него. Просто переместите его выше соответствующего #include , чтобы получить желаемое поведение.