Отладка комментариев и макросов C / C ++

Я использую компилятор g ++ и хочу, чтобы определенные строки моего кода на С ++ были закомментированы или не прокомментированы, в зависимости от моей конфигурации.

Я понимаю, что я мог сделать:

#ifdef DEBUG
cout << "foo" << endl;
#endif

Но я бы предпочел, чтобы все это было в одной строке:

#define DEBUG //
DEBUG cout << "foo" << endl;

…с DEBUG будучи макросом для //, Но писать #define DEBUG // ничего не дает Может кто-нибудь сказать мне, что делать?

1

Решение

Но я бы предпочел, чтобы все это было в одной строке:
#define DEBUG //

Люди привели хорошие примеры того, как добиться того, чего вы хотите, но никто не прокомментировал, почему ваш подход не сработал.

Ваш подход никогда не сработает. Это не может работать. Не существует механизма определения макроса, который становится началом последовательности комментариев по той простой причине, что комментарии не существуют к тому времени, когда определены символы препроцессора. Они уже были раздеты.

2

Другие решения

Вот один из способов сделать это:

#ifdef DEBUG
#define DEBUG_LOG(x) std::cout << x << std::endl;
#else
#define DEBUG_LOG(x)
#endif

DEBUG_LOG("foo")
4

Один трюк от доктора Доббса статья:

#if _DEBUG
// dbgInC defined as "printf" or other custom debug function
#define dbgInC printf
// dbgInCpp defined as "cout" or other custom debug class
#define dbgInCpp cout
#else
// dbgInC defined as null [1]
#define dbgInC
// dbgInCpp defined as "if(0) cerr" or "if(1); else cerr"#define dbgInCpp if(0) cerr
#endif

Это имеет то преимущество, что допускает многострочные операторы:

dbgInCpp << "Debug in C++: "<< a // a is an integer
<< b /* b is char array */
<< c // c is a float
<< endl;
2

Это не идиоматично в C. Предпочитаю использовать обычную форму, например:

#ifdef DEBUG
count << "foo" << endl;
#endif

Или (как assert):

#ifndef NDEBUG
count << "foo" << endl;
#endif

Ради удобочитаемости. Вы также можете инкапсулировать этот код в макрос:

#ifdef DEBUG
#define PRINT_DEBUG(s) cout << s << endl
#else
#define PRINT_DEBUG(s) (void)0
#endif
0

Ты можешь иметь

#ifndef NDEBUG
#define DBGOUT(Out) cout << __FILE__ << ":" << __LINE__ << ":" \
<< Out << endl
#else
#define DBGOUT(Out) do {} while(0)
#endif

и использовать в своем коде такие вещи, как

DBGOUT("x is " << x);

Я использую символ NDEBUG, потому что <assert.h> а также <cassert> используй это.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector