C++ 在C+中调试+;

C++ 在C+中调试+;,c++,debugging,C++,Debugging,我偶然发现了这个代码片段。你能解释一下如何在程序中使用这个调试吗 #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__)

我偶然发现了这个代码片段。你能解释一下如何在程序中使用这个调试吗

#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 
#ifdef测试
#定义调试fprintf(stderr,“==测试===\n”)

#define VALUE(x)cerr我宁愿使用合适的调试器,也不愿使用这些宏,但如果您确实需要使用这些宏,以下是您的操作方法:

#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;
}
如果删除
#define TESTING
,则不会得到任何输出,因此可以根据您是否正在“测试”来删除/设置该输出

或者,通常可以使用构建系统/IDE提供此类定义,根据上下文自动设置/重置。例如,在Visual Studio中:


如何使用此功能进行调试?您可以将其丢弃并使用调试器;)当有更好的方法时,调试不值得将所有代码都与宏混在一起。事实上,什么是不清楚的?您是否尝试调用宏以查看发生了什么?如果您在编译期间定义了
-DDEBUG
,或者在该代码段之前明确定义了
DEBUG
TESTING
,编译器将在代码中使用相应的宏。如果您定义了DEBUG,那么您将在代码中获得更多的调试报告(例如代码段中的cerr语句)。跟踪比(直接)调试更多吗?我最喜欢的部分是,它假定
使用名称空间std(或至少
使用std::cerr;使用std::endl;
)。要么该标题强制使用这些名称,要么使用名称空间std
在任何地方都会出现。很好的建议,我添加了一个例子。
====TESTING====
The value of a is 100
1 + 2 = 3