C++ 中几个帮助调试的宏

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;
}
上一篇:定义了#define NDEBUG ,assert 还生效 的处理方法


下一篇:JUC练习10——线程池