🫒辅助Debugging
2022-5-10
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
程序包含用于调试部分的代码,这部分代码只在开发程序时使用。当应用程序发布时,屏蔽调试代码。这种方法用到两项预处理功能:assertNDEBUG
 

assert预处理宏

C++沿用了C中使用assert宏来断言某些不可能的状态,当assert中表达式求值结果为false将导致程序打印错误信息并退出。使用 assert宏的文件不能再定义名为assert的函数、变量,否则将会被认为是assert宏,因为,宏替换发生在编译器编译之前。
  • assert宏定义在cassert头文件中,宏定义的名字由预处理器处理,而不是编译器。因此可以直接使用assert,而不是std::assert。和预处理变量一样,宏定义的名字必须在程序内唯一。
  • assert常用于检查,程序中"不可能发生的"条件。
 
assert宏的行为只有在没有定义宏NDEBUG时才会执行,可以通过在编译时提供编译选项-D NDEBUG来禁用掉assert宏的执行。通常,在开发时定义assert,在生产上线时关闭assert
 

NDEBUG 预处理变量

assert的行为依赖于于一个名为NDEBUG的预处理变量的状态。
  • 如果定义了NDEBUG,则assert什么也不做
  • 默认状态下没有定义NDEBUG,此时assert将执行运行时检查
可以使用#define语句定义NDEBUG,从而关闭调试状态。
 
C++编译器定义几个特殊的预处理变量用于辅助调试:
  • __func__ 当前所在函数名
  • __FILE__ 当前所在文件名
  • __LINE__ 当前行号
  • __TIME__ 文件编译时的时间
  • __DATE__ 文件编译时的日期
 
除了使用assert外,可以使用NDEBUG编写自己的条件调试代码:
  • C++
  • 函数指针类&对象
    目录