- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++ Assert()断言机制原理以及使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
MSDN原文如是说:
Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program. 。
(判断一个表达式,如果结果为假,输出诊断消息并中止程序。) 。
1
2
3
|
void
assert
(
int
expression
);
|
参数:Expression (including pointers) that evaluates to nonzero or 0.(表达式【包括指针】是非零或零) 。
原理:assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行.
MSDN示例程序 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// crt_assert.c
// compile with: /c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void
analyze_string(
char
*string );
// Prototype
int
main(
void
)
{
char
test1[] =
"abc"
, *test2 = NULL, test3[] =
""
;
printf
(
"Analyzing string '%s'\n"
, test1 );
fflush
( stdout );
analyze_string( test1 );
printf
(
"Analyzing string '%s'\n"
, test2 );
fflush
( stdout );
analyze_string( test2 );
printf
(
"Analyzing string '%s'\n"
, test3 );
fflush
( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void
analyze_string(
char
* string )
{
assert
( string != NULL );
// Cannot be NULL
assert
( *string !=
'\0'
);
// Cannot be empty
assert
(
strlen
( string ) > 2 );
// Length must exceed 2
}
|
输出结果 。
1
2
3
4
5
|
Analyzing string
'abc'
Analyzing string
'(null)'
Assertion failed: string != NULL, file
assert
.cpp, line 25
abnormal program termination
|
用法总结:
1) 在函数开始处检验传入参数的合法性 。
如
1
2
3
4
5
6
7
8
9
10
11
|
int
resetBufferSize(
int
nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert
(nNewSize >= 0);
assert
(nNewSize <= MAX_BUFFER_SIZE);
...
}
|
。
2) 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 。
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize),
好: assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize),
3) 不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 。
错误: assert(i++ < 100) 。
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行.
正确: assert(i < 100); i++,
4) assert和后面的语句应空一行,以形成逻辑和视觉上的一致感 。
5) 有的地方,assert不能代替条件过滤 。
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在.
而assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中.
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销.
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h> #define NDEBUG #include <assert.h> 。
加入#define NDEBUG之后,上文第一个例子输出结果为:
1
2
3
|
Analyzing string
'abc'
Analyzing string
'(null)'
Analyzing string
''
|
在面试中经常用到的一个题目:
已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void
*
memcpy
(
void
*dst,
const
void
*src,
size_t
count)
{
//安全检查
assert
( (dst != NULL) && (src != NULL) );
unsigned
char
*pdst = (unsigned
char
*)dst;
const
unsigned
char
*psrc = (
const
unsigned
char
*)src;
//防止内存重复
assert
(!(psrc<=pdst && pdst<psrc+count));
assert
(!(pdst<=psrc && psrc<pdst+count));
while
(count--)
{
*pdst = *psrc;
pdst++;
psrc++;
}
return
dst;
}
|
以上这篇C++ Assert()断言机制原理以及使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
最后此篇关于C++ Assert()断言机制原理以及使用方法的文章就讲到这里了,如果你想了解更多关于C++ Assert()断言机制原理以及使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
测试返回类型为 bool 的方法时。 你应该: expected = true; Assert.AreEqual(expected, actual); 或 Assert.IsTrue(actual);
我最近在编写新的 NUnit 测试时尝试使用 Assert.Equals() 方法。执行此方法时会抛出一个 AssertionException ,说明Assert.Equals 不应该用于断言。 乍
在 Chai 断言库中,当我们已经有了“assert.deepEqual()”时,“assert.equal()”有什么用"和 "assert.strictEqual()"用于严格和深度相等断言?还提
有没有办法断言 puppet 中的变量(或更具体地说,事实)具有特定值,如果没有则中止安装? 对于背景,情况如下: 在大多数情况下,我可以引用主机名,但有时我需要使用 IP 地址。例如,我们的日志收集
喜欢什么: Assert.That(obj.Foo, Is.EqualTo(true)) 或 Assert.True(obj.Foo) 对我来说,这两个断言是等价的,那么应该首选哪个? 最佳答案 在这
如何在 xUnit 中找到多个断言或软断言?我发现 Nunit 有以下能力,试图在 xUnit 中找到类似的选项。 Assert.Multiple(() => { Assert.AreEqua
有什么区别: Assert.Equals和 Assert.AreEqual Assert.NotNull和 Assert.IsNotNull ... ? 最佳答案 Assert.Equals 是一个对
我想写一个像这样工作的断言函数: //the following expression outputs "assertion failed" to std::err and then terminat
有人可以指出差异吗? 以上确实是我的问题,但是如果您也可以与他们分享您的经验以及您为什么使用其中一个。 最佳答案 它们只是两个不同的库,因此只需查看功能,尤其是报告功能,然后选择即可。 因为我是 的作
我无法找到断言 1 失败但断言 2 通过的原因: var a = Test.test1; var b = Test.test1; a.Should().BeSameAs(b); //1 Assert.
我正在为每个步骤使用 NUnit 断言运行自动化 BDD 步骤,即 Then And 我的 UI 测试。 NUnit 断言仅限于每个方法。这意味着如果方法中的断言失败,则不会运行其他步骤。 我正在考虑
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我只是在寻找一些示例,说明何时适合使用 Assert.Catch 或 Assert.Throws 断言单元测试中抛出的任何异常。我知道我也可以使用 ExpectedException,但我特别想知道“
Assert.AreEqual 和 Assert.AreSame 有什么区别? 最佳答案 这意味着 AreSame() 检查它们是否是完全相同的对象 - 如果引用指示内存中的相同对象。 AreEqua
在C#中,有什么区别 Assert.AreNotEqual 和 Assert.AreNotSame 最佳答案 这里给出的几乎所有答案都是正确的,但可能值得举个例子: public static str
我曾经在 NUnit 中使用过它们,它们非常有用。知道如何做类似的事情吗? 编辑,代码示例: bool condition = false;//would be nice not to have th
关于Arrange-Act-Assert的经典测试模式,我经常发现自己在 Act 之前添加了反断言。这样我就知道传递的断言确实是作为操作的结果传递的。 我认为它类似于红绿重构中的红色,只有当我在测试过
每当我创建断言时,Eclipse 都会建议我从这两个包之一导入它。 例如,当我尝试使用 assertArrayEquals() 比较数组时Eclipse 建议从其中之一导入它 org.junit.As
每当我创建断言时,Eclipse 都会建议我从这两个包之一导入它。 例如,当我尝试使用 assertArrayEquals() 比较数组时Eclipse 建议从其中之一导入它 org.junit.As
我是一名优秀的程序员,十分优秀!