C/C++ 调试技巧

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标记,使用可以用一个单独的命令重新编译代码并插入调试信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 C++98/03的设计目标:一、比C语言更适合系统编程(且与C语言兼容)。二、支持数据抽象。三、支持面向对象...
    认真学计算机阅读 5,340评论 0 53
  • 目录 一.预处理的工作方式... 3 1.1.预处理的功能... 3 1.2预处理的工作方式... 3 二.预处理...
    朱森阅读 1,394评论 0 2
  • C中的预编译宏定义 2009-02-10 作者: infobillows 来源:网络 在将一个C源程序转换为可执行...
    白水灬煮一切阅读 1,634评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • 以为自己是那种可以在高考考场上开车的老司机,没想到却是那条眼中闪着诡异光芒的翻车鱼
    亦车阅读 127评论 0 1