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
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版时,将忽略这些代码。
__ func__是编译器定义的一个局部静态变量,用于存放函数的名字。
#include<iostream> void funcTest(){ std::cout << "函数名为: " <<__func__<< std::endl; } int main(){ funcTest();//输出 函数名为:funcTest }
存放文件名的字符串字面值,例如我们的main函数保存在C盘下的main.cpp中,则以下代码输出 C:\main.cpp;
#include<iostream> int main(){ std::cout << __FILE__ << std::endl; return 0; }
存放当前行号的整型字面值,下面代码输出 3
#include<iostream> int main(){ std::cout << __LINE__ << std::endl; return 0; }
存放文件编译时间。
#include<iostream> int main(){ //输出当前文件的编译时间 std::cout << __TIME__ << std::endl; return 0; }
文件的编译日期
#include<iostream> int main(){ //输出当前文件的编译日期 std::cout << __TIME__ << std::endl; return 0; }