Я использую компилятор g ++ и хочу, чтобы определенные строки моего кода на С ++ были закомментированы или не прокомментированы, в зависимости от моей конфигурации.
Я понимаю, что я мог сделать:
#ifdef DEBUG
cout << "foo" << endl;
#endif
Но я бы предпочел, чтобы все это было в одной строке:
#define DEBUG //
DEBUG cout << "foo" << endl;
…с DEBUG
будучи макросом для //
, Но писать #define DEBUG //
ничего не дает Может кто-нибудь сказать мне, что делать?
Но я бы предпочел, чтобы все это было в одной строке:
#define DEBUG //
Люди привели хорошие примеры того, как добиться того, чего вы хотите, но никто не прокомментировал, почему ваш подход не сработал.
Ваш подход никогда не сработает. Это не может работать. Не существует механизма определения макроса, который становится началом последовательности комментариев по той простой причине, что комментарии не существуют к тому времени, когда определены символы препроцессора. Они уже были раздеты.
Вот один из способов сделать это:
#ifdef DEBUG
#define DEBUG_LOG(x) std::cout << x << std::endl;
#else
#define DEBUG_LOG(x)
#endif
DEBUG_LOG("foo")
Один трюк от доктора Доббса статья:
#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;
Это не идиоматично в 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
Ты можешь иметь
#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>
используй это.