【转】assert预处理宏与预处理变量

本文介绍了assert宏的使用方法及注意事项,包括如何利用assert进行调试,并解释了assert的效果受NDEBUG宏的影响。此外,还介绍了几个常用的预处理变量,如FILE、LINE等,用于获取源代码相关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

assert

assert是一个预处理宏,由预处理器管理而非编译器管理,所以使用时都不用命名空间声明,如果你写成std::assert反而是错的。使用assert需要包含cassert或assert.h,用法如下:

assert(expr)

assert主要用途是:用于调试,检测一些不应该出现的情况。如果expr为假(即为0),assert输出信息并终止程序的运行,如果expr为真,则什么也不做。

assert的使用依赖于一个宏 NDEBUG(No Debug),如果未定义NDEBUG则assert起作用,如果定义了NDEBUG则assert完全不起作用。所以用VS开发时,Debug编译时assert有效,Release编译时assert无效。

示例代码:

1 void test()
2 {   
3     int id = -2;
4     assert(id >= 0);
5 }

一般ID是不会有负数的,于是我们用assert检测程序中的id是否有负数,如果id为负数,在Debug模式下运行会弹出以下警告框,在在Release模式下运行会则什么也不发生。 

这样做的好处是程序在调试时就会发现其中的错误。

 

**注:assert应仅用于验证那些不可能发生的事情,而不能用它来代替真正的运行时的逻辑检查,也不能代替程序本身应该包含的错误检查

 

预处理变量

与assert类似,预处理器还定义了一些变量用于存放源代码的相关信息,这里只列举常用的预处理变量:

FILE :源代码所在的路径和文件名; 
LINE :代码所在的行号 
FUNCTION:代码所在的函数的函数名 
DATE :文件编译时的日期 
TIME :文件编译时的时间

 

这些信息在调试和日志记录时非常有用,能准确定义错误所在的位置。

示例代码:

1 void test()
2 {   
3     cout << "in " << __FILE__ << " file, " << __LINE__ << " line " << endl;
4     cout << "in " << __FUNCTION__ << " function." << endl;
5     cout << "at " __DATE__ << " " << __TIME__ << endl;
6 }

在Debug模式下运行结果如下: 

 

转自《assert预处理宏与预处理变量》

转载于:https://www.cnblogs.com/codingmengmeng/p/6709454.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值