type
status
date
slug
summary
tags
category
icon
password
Property
程序包含用于调试部分的代码,这部分代码只在开发程序时使用。当应用程序发布时,屏蔽调试代码。这种方法用到两项预处理功能:
assert
和NDEBUG
。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
编写自己的条件调试代码: