Я бы предпочел использовать правильный отладчик, чем эти макросы, но если вам действительно нужно их использовать, вот как вы это сделаете:
#include <iostream>
using namespace std; // better remove this and change the macro with cerr and endl instead
#define TESTING
#ifdef TESTING
#define DEBUG fprintf(stderr, "====TESTING====\n")
#define VALUE(x) cerr << "The value of " << #x << " is " << x << endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define DEBUG
#define VALUE(x)
#define debug(...)
#endif
int main(int argc, char **argv) {
int a = 100;
DEBUG; // prints "====TESTING===="
VALUE(a); // prints "The value of a is 100"
debug("%d + %d = %d", 1, 2, 1 + 2); // prints "1 + 2 = 3"
return 0;
}
Это даст вам следующий вывод:
====TESTING====
The value of a is 100
1 + 2 = 3
Если вы удалите #define TESTING
, вы не получите ничего из этого вывода, поэтому вы можете удалить / установить его в зависимости от того, «тестируете» вы или нет.
В качестве альтернативы, обычно можно предоставить такие определения, используя систему сборки / IDE, где они могут быть автоматически установлены / сброшены в зависимости от контекста. Например, в Visual Studio:
