C++ 中几个帮助调试的宏
1. assert(expr)预处理宏
assert是一种预处理宏,它使用一个表达式作为它的条件;首选对expr求值,如果expr为flase(即0),assert输出信息并终止程序的执行,如果为true 则什么也不做。assert包含在cassert头文件中。
#include <cassert>
int main(){
assert(5==6);
return 0;
}
以上代码会在Debug模式下中断程序并输出Assertion failed: 5 == 6, file C:\Users\asus\source\repos\ConsoleApplication5\ConsoleApplication5.cpp, line 3
2. NDEBUG预处理变量
assert的行为依赖于NDEBUG的预处理变量,查看vs中assert的实现代码如下。
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif
由此可见,如果我们定义了NDEBUG预处理变量,assert就什么也不作。我们可以使用#define 定义NDEBUG。
#define NDEBUG
int main(){
assert(5==6);//此时不执行。
}
在VS中程序在Release模式下默认定义了NDEBUG,因此我们可以在代码中利用NDEBUG编写调试代码,程序在发布Relese版时,将忽略这些代码。
3. _ _ func_ _
__ func__是编译器定义的一个局部静态变量,用于存放函数的名字。
#include<iostream>
void funcTest(){
std::cout << "函数名为: " <<__func__<< std::endl;
}
int main(){
funcTest();//输出 函数名为:funcTest
}
4. __ FILE__
存放文件名的字符串字面值,例如我们的main函数保存在C盘下的main.cpp中,则以下代码输出 C:\main.cpp;
#include<iostream>
int main(){
std::cout << __FILE__ << std::endl;
return 0;
}
5.__ LINE__
存放当前行号的整型字面值,下面代码输出 3
#include<iostream>
int main(){
std::cout << __LINE__ << std::endl;
return 0;
}
6.__ TIME__
存放文件编译时间。
#include<iostream>
int main(){
//输出当前文件的编译时间
std::cout << __TIME__ << std::endl;
return 0;
}
7. __ DATE__
文件的编译日期
#include<iostream>
int main(){
//输出当前文件的编译日期
std::cout << __TIME__ << std::endl;
return 0;
}