C/C++ 调试技巧

作者: Amrzs | 来源:发表于2014-06-14 13:52 被阅读484次

    C/C++ 调试技巧

    from my csdn blog

    调试宏

    assert()

    参数为一个断言为真的表达式,如果断言不为真,则发出一个错误信息告诉断言是什么并且程序终止。

    #include <iostream>
    #include <cassert>
    
    using namespace std;
    
    int main(){
    
        int i = 100;
        assert(i != 100);
        cout << i << endl;
    
        return 0;
    }
    
    amrzs@ubuntu:cc$ g++ main.cpp
    amrzs@ubuntu:cc$ ./a.out 
    a.out: main.cpp:11: int main(): Assertion `i != 100' failed.
    已放弃 (核心已转储) 
    

    消除宏代码

    #include<cassert>之前插入#define NDEBUG

    或者在编译器命令行中定义ndebug,可以消除宏产生的代码

    #include <iostream>
    
    #define NDEBUG
    #include <cassert>
    
    using namespace std;
    
    int main(){
    
        int i = 100;
        assert(i != 100);
        cout << i << endl;
    
        return 0;
    }
    
    amrzs@ubuntu:cc$ g++ main.cpp
    amrzs@ubuntu:cc$ ./a.out 
    100
    

    变量字符串转换宏

    变量表达式转换为字符串

    在一个预处理器的宏中的参数前面使用一个#,预处理器会把这个参数转换成一个字符数组

    #define P(A) cout << #A << ": " << (A) << endl;

    当不想调试时,也可以插入一个#ifdef使得定义的P(A)不起作用。

    调试标记:预处理器调试标记 和 运行期调试标记

    常用的标记名为DEBUG(不能使用NDEBUG,是C中的保留字)

    #define DEBUG
    //...
    #ifdef DEBUG 
    //...debugging code 
    #endif // DEBUG
    

    C/C++还允许在编译器的命令行中使用#define#undef标记,使用可以用一个单独的命令重新编译代码并插入调试信息

    相关文章

      网友评论

      • 逸之:MARKDOWN就是把代码全部标记成红色?

      本文标题:C/C++ 调试技巧

      本文链接:https://www.haomeiwen.com/subject/jrqjtttx.html