码迷,mamicode.com
首页 > 其他好文 > 详细

assert预处理宏与预处理变量

时间:2015-07-27 00:20:44      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:c++高级编程   c++   assert   

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无效。

示例代码:

void test()
{   
    int id = -2;
    assert(id >= 0);
}

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

技术分享

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

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

预处理变量

与assert类似,预处理器还定义了一些变量用于存放源代码的相关信息,这里只列举常用 的预处理变量:
FILE :源代码所在的路径和文件名;
LINE :代码所在的行号
FUNCTION:代码所在的函数的函数名
DATE :文件编译时的日期
TIME :文件编译时的时间

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

void test()
{   
    cout << "in " << __FILE__ << " file, " << __LINE__ << " line " << endl;
    cout << "in " << __FUNCTION__ << " function." << endl;
    cout << "at " __DATE__ << " " << __TIME__ << endl;
}

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

技术分享

版权声明:本文为博主原创文章,未经博主允许不得用于任何商业用途,转载请注明出处。

assert预处理宏与预处理变量

标签:c++高级编程   c++   assert   

原文地址:http://blog.csdn.net/luoweifu/article/details/47074389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!