本文目录一览:
1、c语言中aver什么意思
2、C语言中assert断言的用法?
3、C语言中用ASSERT调试的八大技巧
4、assert的作用是什么
5、ASSERT在C语言中有什么作用?
c语言中aver什么意思
英文为“断言”的意思,而在C语言中,一般都指的是自定义中的“average”的简写,自然,指的是“平均”。
C语言中assert断言的用法?
assert
宏的原型定义在assert.h
中,其作用是如果它的条件返回错误,则终止程序执行。
库函数: assert.h
原型定义: void assert( int expression );
assert
的作用是先计算表达式 expression
,如果其值为假(即为0),那么它会先向stderr
打印一条出错信息,然后通过调用 abort
来终止程序运行。
示例代码:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
fp = fopen("test.txt", "w"); // 以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert(fp); // 所以这里不会出错
fclose(fp);
fp = fopen("noexitfile.txt", "r"); // 以只读的方式打开一个文件,如果不存在就打开文件失败
assert(fp); // 所以这里出错
fclose(fp); // 程序永远都执行不到这里来
return 0;
}
输出结果:
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.
已放弃
使用assert的缺点:
频繁的调用会极大地影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>
的语句之前插入 #define NDEBUG
来禁用assert
调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
- 在函数开始处检验传入参数的合法性
int resetBufferSize(int nNewSize) { // 功能: 改变缓冲区大小 // 参数: nNewSize 缓冲区新长度 // 返回值: 缓冲区当前长度 // 说明: 保持原信息内容不变,nNewSize=0表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ... }
- 每个assert只检验一个条件
不好:
好:assert(nOffset >= 0 && nOffset + nSize == m_nInfomationSize);
assert(nOffset >= 0); assert(nOffset + nSize == m_nInfomationSize);
- 不能使用改变环境的语句
错误:
正确:assert(i++ < 100);
assert(i < 100); i++;
- assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
- 有的地方,assert不能代替条件过滤
C语言中用ASSERT调试的八大技巧
技巧1:记住ASSERT的定义
对许多开发人员来说,断言是一个令人困惑的话题,因为它们的许多使用方式与其设计初衷背道而驰。我见到的最清晰的断言定义是这样的:
“断言是在程序某个特定点的一个布尔表达式,除非程序中有缺陷(Bug),否则它的值将为真。” 理解上述定义的开发人员应该留意下面三个要点:
- 断言会评估一个表达式是真还是假
- 断言是在代码中的某个点对系统状态的一种假设
- 断言会验证系统假设,如果不为真,就表明代码中有一个缺陷
技巧2:使用ASSERT验证函数的先决条件
断言非常适合契约式设计环境,在这种环境中,开发人员非常清晰地定义了某个函数的先决条件。断言可以用来检查该函数的输入是否满足先决条件。 例如:
void System_StateSet(SystemState_t State)
{
assert(State < SYSTEM_STATE_MAX); // 验证State是有效的假设
...
}
技巧3:使用ASSERT验证函数的后置条件
断言也能用来验证契约式设计环境中对某个函数输出的假设。 例如:
SystemState_t System_StateSet(SystemState_t State)
{
SystemState = State;
assert(SystemState < SYSTEM_STATE_MAX); // 验证输出是否符合预期
return SystemState;
}
技巧4:不要把ASSERT用于错误处理
断言是用于检测缺陷的,不能用于错误处理。错误处理是设计用于响应错误的用户输入和意外的事件顺序的软件。 例如,检查文件指针是否为NULL应使用错误处理,而不是断言:
fp = fopen("file.txt", "r");
if (fp == NULL) {
// 错误处理
}
技巧5:ASSERT仅对开发有意义,不能用于生产
开发ASSERT
宏的原始意图是在开发过程中启用它,在生产时要禁用。可以用NDEBUG
宏激活和禁用ASSERT
。
禁用断言可能导致交付的产品与测试的产品处于不同的状态,因此开发团队需要判断是否值得冒关闭断言的风险。
一种替代方案是保留断言在激活状态,而将它们的输出重定向到一个系统日志。
技巧6:不允许断言有副作用
传递给ASSERT
的表达式不应有副作用,否则禁用断言将改变系统的行为。
技巧7:断言应该占代码的1%至3%
不管开发人员认可的占比是1%、3%还是5%,使用断言肯定对你有利,并会使开发嵌入式软件变得多少有些趣味。
技巧8:将断言用作可执行代码注释
断言可以生成极好的注释!编写出色的表达式可以确切地告诉开发人员在代码的某个给定点应该预料发生什么事情。
assert的作用是什么
一、assert的基本意思是“坚持”“断言”,即做主观的、自信的、有说服力的阐述。
二、这种“主张”或“断言”尽管有时并无凭据,但是要让别人相信自己的话是有依据的,或要别人对凭据感兴趣。
- 读音: 英 [əˈsɜːt] / 美 [əˈsɜːrt]
- 释义: 明确肯定,断言。
- 语法:
assert
表示“主张,断言”,指宣称某事如此,并不说它是事实,着重主观自信心。 - 例句: He's speaking up and asserting himself confidently.(他明确表态,信心十足地阐述自己的观点。)
近义词:declare
- 读音: 英 [dɪˈkleə(r)] / 美 [dɪˈkler]
- 释义: 宣告,表明,宣称。
- 语法:
declare
的基本意思是明确地、清楚地、正式地“宣布,宣告”,多用于官方场合。引申可指“宣称”“断言”“申报”等。 - 例句: Your income must be declared on this form.(必须在这张表格上申报你的收入。)
ASSERT在C语言中有什么作用?
是程序调试很重要的手段。
ASSERT(f)
在Debug模式下,每次运行到这里后会计算括号中的表达式,如果表达式为0,则中断执行,弹出一个警告框,用户可选择“继续”,“重试”,“忽略”。
在Release模式下,这句语句不会被编译进代码。
ASSERT
一般用于程序内部确认参数的正确性,即调用内部函数的时候,要由调用者保证参数的正确,而被调用函数内部,就可以通过ASSERT
来检查参数是否满足要求。