断言assert()与调试帮助
- 列表内容assert()是一种预处理宏(preprocessor marco),使用一个表达式来作为条件,只在DEBUG模式下才有用。
assert(expr);
对expr求值,如果expr为假,则输出信息并终止程序,反之则什么也不做。
用来检查"不会发生"的条件。
assert的行为依赖与NDEBUG的预处理变量的状态,如果定义了这个变量,则assert什么也不做。如果定义了NDEBUG,编译器会认为是非DEBUG模式(like release模式)
#include<iostream>
#include<string>
// 去注释则禁用 assert()
//#define NDEBUG
#include<cassert>
using namespace std;
int main()
{
string word;
size_t the = 5;
cin >> word;
assert(word.size() > the);
if (word.size() < the) {
cerr << "Error :" << __FILE__
<< " : in function " << __func__
<< " at line " << __LINE__ << endl
<< " Compiled on " << __DATE__
<< " at " << __TIME__ << endl
<< " Word read was \"" << word
<< "\": Length too short " << endl;
}
return 0;
}
未去注释版本在assert(word.size() > the);这里会退出,如下图

去注释版本,禁用assert(),则继续执行

- 这里有一个问题,如果这么写,将宏定义写在
<cassert>头文件之后的话,那么这个禁用将不起效果,这里的assert仍然会执行。
#include<iostream>
#include<string>
#include<cassert>
using namespace std;
#define NDEBUG
using namespace std;
int main()
{
string word;
size_t the = 5;
cin >> word;
assert(word.size() > the);
if (word.size() < the) {
cerr << "Error :" << __FILE__
<< " : in function " << __func__
<< " at line " << __LINE__ << endl
<< " Compiled on " << __DATE__
<< " at " << __TIME__ << endl
<< " Word read was \"" << word
<< "\": Length too short " << endl;
}
return 0;
}
- 但是为什么呢?打开
#include<cassert>文档看到这个,说明C++仍然采用了C的定义,所以继续打开#include <assert.h>
// cassert standard header
// NOTE: no include guard
#include <yvals.h>
#include <assert.h>
//
// assert.h
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines the assert macro and related functionality.
//
#if defined _VCRT_BUILD && !defined _ASSERT_OK
#error assert.h not for CRT internal use
#endif
#include <corecrt.h>
_CRT_BEGIN_C_HEADER
#undef assert
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif
_CRT_END_C_HEADER
所以在这之前定义了NDEBUG,assert(expression)就变成了((void)0),也就是禁用了,否则才会开始执行检查。
而如果在这个之后定义了NDEBUG,也就相当于在上面最后又加了一句#define NDEBUG,但是这个时候检查已经开始了,所以这一句也没用了。
- 辅助诊断变量,均在预处理器中定义.
__FILE__ //存放文件名的字符串字面值
__LINE__ //存放当前行号的整型字面值
__TIME__ //存放文件编译时间的字符串字面值
__DATE__ //存放文件编译日期的字符串字面值
断言assert()与调试帮助的更多相关文章
- 断言(assert)的用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...
- C语言中断言ASSERT
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种&qu ...
- 使用断言assert
之前有看过关于Assert的书,但是不懂得如何去用,最近看别人写的代码有用这个断言(assert),今天自己动手看看如何使用断言. 断言(assert)的语义如下:如果表达式的值为0(假),则输出错误 ...
- 断言Assert的使用
转载地址:http://www.cnblogs.com/moondark/archive/2012/03/12/2392315.html 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏 ...
- K:java 断言 assert 初步使用:断言开启、断言使用
@转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...
- java的断言(assert)
概述 在C和C++语言中都有assert关键,表示断言.在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.在Java中,assert关键字是从JAVA SE 1.4 引入的,为了 ...
- C# 断言 Assert
重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...
- 断言(assert)
断言(assert):用来调试.测试代码. 格式: assert 布尔表达式: 字符串 (如果布尔表达式为false时,这个字符串才会显示). 注意: assert默认是关闭的,使用时需要使用&quo ...
- 你所不知的 PHP 断言(assert)
PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...
随机推荐
- Re-thinking Deep Residual Networks
本文是对ImageNet 2015的冠军ResNet(Deep Residual Networks)以及目前围绕ResNet这个工作研究者后续所发论文的总结,主要涉及到下面5篇论文. 1. Link: ...
- mianxiangduixiang
package com.hanqi; public class mianxiang { public static void main(String[]args) { Cat c1 =new Cat( ...
- IIFE
一.IIFE IIFE:immediately-invoked function expression,即时调用函数表达式. 如果一个函数,在定义的时候,就想直接调用它,就是一个IIFE. 函数执行方 ...
- 在 Linux 中使用 Azure Premium 存储的基本优化指南
Note 以下测试和结果都是基于 CentOS 6.5.对于其他版本,请参考本文档,并自行进行相关测试. 建议使用最新的内核版本 一般情况下,新的内核版本能解决老版本中存在的问题,添加对新出现硬件的支 ...
- DevExpress之ChartControl用法
DevExpress中的ChartControl顾名思义就是数据基于图表展示,其关键在于Series上的处理. using System; using System.Drawing; using De ...
- 用CSS写扫描二维码图标
代码如下: <style>.icon{margin:300px;width:30px;height:30px;position:relative}.icon .b{border:2px s ...
- Python学习---深浅拷贝的学习
浅拷贝copy(): 修改字符串,原来的不变: 更改列表,2个同时修改,以为列表里面还涉及一个指针的索引. 简单讲就是copy()只是简单地copy了第一层,第二层不被copy 深拷贝: 需要单独的 ...
- IIS7.5使用web.config设置伪静态的方法
IIS 7和IIS 7.5及以后的版本估计都会使用web.config来实现伪静态规则,于是我们以前的伪静态文件必须更改.网上找了一圈,还没有发现比较全面的web.config伪静态规则,于是我们这里 ...
- Memory Leak Detection in Embedded Systems
One of the problems with developing embedded systems is the detection of memory leaks; I've found th ...
- selenium+python 数据驱动-txt篇
#循环读取txt文件中的数据,可以作为用户名,密码等使用from selenium import webdriver #创建两个列表user=[]pwd=[]f=open(r'C:\bbs\data\ ...