#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
, чтобы получить желаемое поведение.