引入:
  • 程序在发布时包含一些用于调试的代码,这些代码在程序开发时使用。当应用程序编写完成之后,就需要删除这些调试代码
  • 调试代码经常用到两个预处理的功能:assert和NDEBUG
一、assert预处理宏

1.功能

  • assert是一种预处理宏,用于调试代码。经常用于检查“不能发生”的条件
  • 包含在#include <assert.h头文件中>

2.格式

assert(expr);

  • 如果expr正确(非0),assert什么也不做
  • 如果expr错误(为0),assert输出信息并终止程序的执行

3.注意事项

  • 该预处理宏只能在程序的DEBUG版本版本中使用,不能在非DEBUG版本中使用(受限于NODEBUG预处理变量)
二、NDEBUG预处理变量

1.功能

  • 如果定义了此预处理变量,则程序此时处于非DEBUG状态,就不能使用assert预处理宏

2.注意事项

  • 此预处理变量默认为非定义状态,需要手动给出定义
  • 如果给出了NDEBUG,程序就不能使用assert了。但是#define NDEBUG必须定义在#include <assert.h的前面>。因为必须在<assert.h>的前面,所以有两种方法定义NDEBUG预处理变量(①在命令行加入宏:gcc -D NDEBUG ②在程序代码中将NDEBUG定义在<assert.h>的前面)

3.使用场景

  • 此预处理变量可以配合#ifndef、#ifdef、#endif来使用,来区分调试代码和非调试代码
#include <stdio.h>

#define NDEBUG //必须定义在<assert.h>前面
#include <assert.h>

int main()
{
#ifdef NDEBUG //如果定义了就执行一下部分
    printf("HelloWorld\n");
#endif
    assert(0); //无效,不起作用
    printf("HelloWorld\n");
    return 0;
}