什么是“断言”功能?(What is the “assert” function?)

2019-08-18 06:38发布

我一直在学习OpenCV的教程和跨来到assert功能; 它有什么作用?

Answer 1:

assert会终止程序(通常用消息引述断言语句),如果它的参数被证明是假的。 它在调试过程中,通常用于将让程序失败,如果发生意外情况更为明显。

例如:

assert(length >= 0);  // die if length is negative.

您还可以添加更翔实的消息显示,如果它失败,就像这样:

assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");

或者是这样的:

assert(("Length can't possibly be negative! Tell jsmith", length >= 0));

当你做一个版本(非调试)建立,还可以去除评估的开销assert通过定义语句NDEBUG宏,通常用编译器开关。 这样做的必然结果是,你的程序应该依靠断言宏运行。

// BAD
assert(x++);

// GOOD
assert(x);    
x++;

// Watch out! Depends on the function:
assert(foo());

// Here's a safer way:
int ret = foo();
assert(ret);

从程序调用中止()和组合不保证做任何事,断言应仅用于测试的东西,开发商承担,而不是,例如,用户输入一个数字,而不是字母(这应该是通过其他方式处理)。



Answer 2:

断言计算机语句是类似于声明确保英语。



Answer 3:

看一眼

用C断言()的示例程序++

许多编译器提供一个断言()宏。 如果它的参数判断为真,并采取某种行动,如果评估不实的断言()宏返回TRUE。 许多编译器将中止对失败的断言()程序; 别人会抛出异常

断言()宏的一个强大功能是预处理器将其折叠成任何代码,如果没有定义DEBUG的。 这是发展过程中有很大的帮助,而当最终产品船只有没有性能损失,也没有增加的程序的可执行版本的大小。

例如

#include <stdio.h>
#include <assert.h>

void analyze (char *, int);

int main(void)
{
   char *string = "ABC";
   int length = 3;

   analyze(string, length);
   printf("The string %s is not null or empty, "
          "and has length %d \n", string, length);
}

void analyze(char *string, int length)
{
   assert(string != NULL);     /* cannot be NULL */
   assert(*string != '\0');    /* cannot be empty */
   assert(length > 0);         /* must be positive */
}

/****************  Output should be similar to  ******************
The string ABC is not null or empty, and has length 3


Answer 4:

断言()函数可以诊断程序错误。 据中所定义<assert.h>的,其原型是

void assert(int expression);

参数表达式可以做你想做的任何测试 - 一个变量或任何C的表达。 如果表达式的计算结果为TRUE,断言()什么都不做。 如果表达式评估为假,断言()在stderr显示错误消息并终止执行程序。

你如何使用断言()? 这是最常用的追踪程序错误(这是由编译错误不同)。 一个错误不能防止程序编译,但它会导致它给不正确的结果或运行不当(锁定了,例如)。 比如,你正在写一个财务分析程序可能会偶尔给不正确的答案。 你怀疑问题是由可变interest_rate取了负值,这绝不应该发生而引起的。 要对此进行检查,将声明

断言(interest_rate> = 0); 在其中使用interest_rate程序位置。 如果变量永远不会变为负值,断言()宏提醒您。 然后,您可以检查相关代码以找到问题的原因。

看到断言()是如何工作的,运行下面的示例程序 。 如果输入一个非零值,程序会显示值与正常终止。 如果您输入零,断言()宏力程序异常终止。 你看到的将取决于你的编译器,但这里的确切的错误信息是一个典型的例子:

断言失败:X,文件list19_3.c,行13注意,为了断言()的工作,你的程序必须在调试模式下编译。 请参阅您的编译器文档有关启用调试模式(在一个时刻作为解释)。 当你以后在编译发布模式的最终版本,断言()宏被禁用。

 int x;

 printf("\nEnter an integer value: ");
 scanf("%d", &x);

 assert(x >= 0);

 printf("You entered %d.\n", x);
 return(0);

输入的整数值:10

您输入10。

输入一个整数值:-1

错误消息:异常程序终止

您的错误信息可能会有所不同,这取决于你的系统和编译器,但总的想法是一样的。



Answer 5:

这样的东西“产生异常”和“暂停执行”可能是大多数编译器正确的,但不是所有的。 (顺便说一句,有没有断言,真正抛出异常的语句?)

这是一个被C6X和其他TI编译器使用了一个有趣的,略有不同的断言的含义是:当看到某些断言语句,这些编译器使用这些信息在声明中执行某些优化。 邪恶。

实施例C:

int dot_product(short *x, short *y, short z)
{
  int sum = 0
  int i;

  assert( ( (int)(x) & 0x3 ) == 0 );
  assert( ( (int)(y) & 0x3 ) == 0 );

  for( i = 0 ; i < z ; ++i )
    sum += x[ i ] * y[ i ];
  return sum;
}

这告诉解编译器的阵列上的32位边界上对齐,所以编译器可以生成用于那种对准作出具体说明。



Answer 6:

C ++ 11 N3337标准草案

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

19.3断言

1头<了cassert>,在(表42)所描述的,提供了一种用于记录的C ++程序断言和用于禁用断言检查的机构的宏。

2的内容是一样的标准C库头<ASSERT.H>。

C99 N1256标准草案

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

7.2诊断<assert.h> 2用于

1头<assert.h>定义assert宏并且是指另一个宏, NDEBUG其不受定义<assert.h> 如果NDEBUG在其中包含<assert.h> 2用于在源文件中的点定义为宏名称,断言宏被简单地定义

  #define assert(ignore) ((void)0) 

断言宏根据NDEBUG的每个时间的当前状态重新定义<assert.h>被包括。

2. assert宏应被实现为一个宏,而不是实际的功能。 如果宏定义是为了获得一个实际的功能抑制,则行为未定义。

7.2.1程序诊断

7.2.1.1断言宏

概要

1。

 #include <assert.h> void assert(scalar expression); 

描述

2断言宏把诊断测试入方案; 它扩展到空隙表达。 当它被执行时,如果表达式(其应具有一个标量型)为假(即,比较等于0),则断言宏写关于失败的特定呼叫信息(包括参数的文本,的名称源文件,源代码行号,和包围函数的名称-后者分别预处理宏的值__FILE____LINE__和标识符的__func__ )在一个实现定义格式的标准错误流。 165)然后调用abort函数。

返回

3断言宏无返回值。



Answer 7:

它是将暂停程序执行,如果有否评估值是假的函数。 通常它是由这样当与发行设置编译它不是编译成二进制结果的宏包围。

它被设计用来测试所做的假设。 例如:

void strcpy(char* dest, char* src){
    //pointers shouldn't be null
    assert(dest!=null);
    assert(src!=null);

    //copy string
    while(*dest++ = *src++);
}

你想要的理想的是,你可以在你的程序出现错误,比如调用带有无效参数的函数,和你打的断言它出现segfaults(或未能按预期工作)之前



Answer 8:

断言允许你停止执行,如果条件(断言)是假的。

例如(伪):

Bank myBank = Bank.GetMyStuff();

assert(myBank != NULL);

// .. Continue.

如果myBank为NULL,函数将停止执行,并且错误产生。 这是使某些可重用的代码非常好接受正确的条件等。



Answer 9:

有使用断言()函数在正常的,如果别人和printf三大原因

  1. 断言()函数主要用于调试阶段,很乏味,如果别人用printf语句每次要测试的条件可能也不做它的方式在最后的代码来写。

  2. 在大型软件部署,断言来非常方便,你可以让编译器忽略通过连结的断言()函数的头文件之前定义NDEBUG宏断言语句。

  3. 断言()来得心应手,当你在设计一个功能或一些代码,并希望得到一个想法是什么限制了代码,而不是工作,最后包括的if else评估它基本上与假设播放。



Answer 10:

此外,你可以用它来检查,如果动态分配是成功的。

代码示例:

int ** p;
p = new int * [5];      // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
    p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
                       // array (size 3) of actual int values
}

assert (p);            // Check the dynamic allocation.

相近:

if (p == NULL) {
    cout << "dynamic allocation failed" << endl;
    exit(1);
}


文章来源: What is the “assert” function?
标签: c++ c assert