在调试模式或测试期间,我需要打印大量各种信息,因此我使用以下方法:
#ifdef TESTING
// code with lots of debugging info
#else
// clean code only
#endif // TESTING`
这是一种好的方法吗,还是有其他简单而优雅的方法?
但是这样做,我在两个地方重复了相同的代码,如果以后要更改代码中的任何内容,我必须在两个地方进行更改,这很耗时且容易出错。
谢谢。
我正在使用MS Visual Studio。
在调试模式或测试期间,我需要打印大量各种信息,因此我使用以下方法:
#ifdef TESTING
// code with lots of debugging info
#else
// clean code only
#endif // TESTING`
这是一种好的方法吗,还是有其他简单而优雅的方法?
但是这样做,我在两个地方重复了相同的代码,如果以后要更改代码中的任何内容,我必须在两个地方进行更改,这很耗时且容易出错。
谢谢。
我正在使用MS Visual Studio。
#ifdef _DEBUG
#define DEBUG_PRINT(x) printf(x);
#else
#define DEBUG_PRINT(x)
#endif
使用这种方法,您还可以添加更多的信息,例如
__LINE__
__FILE__
自动获取调试信息。
#ifdef _DEBUG
const bool is_debig = true;
#else
const bool is_debig = false;
#endif
template<bool debug>
struct TemplateDebugHelper {
void PrintDebugInfo(const char* );
void CalcTime(...);
void OutputInfoToFile(...);
/// .....
};
// Empty inline specialization
template<>
struct TemplateDebugHelper<false> {
void PrintDebugInfo(const char* ) {} // Empty body
void CalcTime(...) {} // Empty body
void OutputInfoToFile(...) {} // Empty body
/// .....
};
typedef TemplateDebugHelper<is_debug> DebugHelper;
DebugHelper global_debug_helper;
int main()
{
global_debug_helper.PrintDebugInfo("Info"); // Works only for is_debug=true
}
在包含头文件时使用类似于这样的定义
#ifdef TESTING
#define DEBUG_INFOS(_X_) CallYourDebugFunction(_X_ )
#else
#define DEBUG_INFOS(_X_) ((void)0)
#endif
然后在您的代码中仅使用此内容。
...
DEBUG_INFOS("infos what ever");
RestOfWork();
...
你还可以使用和查找ASSERT和TRACE宏,并使用sysinternals的DebugView实时读取跟踪输出,或者跟踪ASSERT中出现的问题。ASSERT和TRACE执行类似的工作,你可以从它们那里获取想法。
备注:我使用了TESTING声明,因为我在问题中看到了它。
void init()
{
logging::core::get()->set_filter
(
flt::attr< logging::trivial::severity_level >("Severity") >= logging::trivial::info
);
}
int main(int, char*[])
{
init();
BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
BOOST_LOG_TRIVIAL(info) << "An informational severity message";
BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
BOOST_LOG_TRIVIAL(error) << "An error severity message";
BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
}
我认为pantheios也有类似的东西。
有一种简单的方法,适用于大多数编译器:
#ifdef TESTING
#define DPRINTF( args ) printf args
#else
#define DPRINTF( args ) ((void)0)
#endif
接下来,在源代码中您应该这样使用它:
DPRINTF(("Debug: value a = %d, value b = %d\n", a, b));
缺点是你必须使用双括号,但在旧的 C 和 C++ 标准中,可变参数宏不受支持(只能作为编译器扩展)。
我用C语言编写嵌入式系统程序。在我的程序中,我使用以下宏:
#define _L log_stamp(__FILE__, __LINE__)
#define _LS(a) log_string(a)
#define _LI(a) log_long(a)
#define _LA(a,l) log_array(a,l)
#define _LH(a) log_hex(a)
#define _LC(a) log_char(a)
#define ASSERT(con) log_assert(__FILE__, __LINE__, con)
当我制作发布版本时,我只需关闭 #define DEBUG 指令,所有宏都变为空。请注意,在发布版本中不会消耗任何 CPU 循环和内存。宏是保存日志信息的唯一方式:记录日志的位置(文件和行号)。
如果需要此信息,则使用:_L;_LS("this is a log message number ");_LI(5);
否则就不需要 _L
指令。