C语言assert(断言)简介

描述

一、assert(断言)简介

assert的功能,条件为真,程序继续执行;如果断言为假(false),则程序终止。

assert是个 宏定义

头文件:

#include < assert.h >

原型:

void assert(scalar expression);

返回值:无返回值。

头文件assert.h内容如下:

/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.


   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.


   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.


   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   < http://www.gnu.org/licenses/ >.  */


/*
 *  ISO C99 Standard: 7.2 Diagnostics  < assert.h >
 */


#ifdef  _ASSERT_H


# undef  _ASSERT_H
# undef  assert
# undef __ASSERT_VOID_CAST


# ifdef  __USE_GNU
#  undef assert_perror
# endif


#endif /* assert.h  */


#define  _ASSERT_H  1
#include < features.h >


#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast< void >
#else
# define __ASSERT_VOID_CAST (void)
#endif


/* void assert (int expression);


   If NDEBUG is defined, do nothing.
   If not, and EXPRESSION is zero, print an error message and abort.  */


#ifdef  NDEBUG


# define assert(expr)    (__ASSERT_VOID_CAST (0))


/* void assert_perror (int errnum);


   If NDEBUG is defined, do nothing.  If not, and ERRNUM is not zero, print an
   error message with the error text for ERRNUM and abort.
   (This is a GNU extension.) */


# ifdef  __USE_GNU
#  define assert_perror(errnum)  (__ASSERT_VOID_CAST (0))
# endif


#else /* Not NDEBUG.  */


#ifndef _ASSERT_H_DECLS
#define _ASSERT_H_DECLS
__BEGIN_DECLS


/* This prints an "Assertion failed" message and aborts.  */
extern void __assert_fail (const char *__assertion, const char *__file,
         unsigned int __line, const char *__function)
     __THROW __attribute__ ((__noreturn__));


/* Likewise, but prints the error text for ERRNUM.  */
extern void __assert_perror_fail (int __errnum, const char *__file,
          unsigned int __line, const char *__function)
     __THROW __attribute__ ((__noreturn__));




/* The following is not at all used here but needed for standard
   compliance.  */
extern void __assert (const char *__assertion, const char *__file, int __line)
     __THROW __attribute__ ((__noreturn__));




__END_DECLS
#endif /* Not _ASSERT_H_DECLS */


/* When possible, define assert so that it does not add extra
   parentheses around EXPR.  Otherwise, those added parentheses would
   suppress warnings we'd expect to be detected by gcc's -Wparentheses.  */
# if defined __cplusplus
#  define assert(expr)              
     (static_cast 
      ? void (0)              
      : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
# elif !defined __GNUC__ || defined __STRICT_ANSI__
#  define assert(expr)              
    ((expr)                
     ? __ASSERT_VOID_CAST (0)            
     : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
# else
/* The first occurrence of EXPR is not evaluated due to the sizeof,
   but will trigger any pedantic warnings masked by the __extension__
   for the second occurrence.  The ternary operator is required to
   support function pointers and bit fields in this context, and to
   suppress the evaluation of variable length arrays.  */
#  define assert(expr)              
  ((void) sizeof ((expr) ? 1 : 0), __extension__ ({      
      if (expr)                
        ; /* empty */              
      else                
        __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION);  
    }))
# endif


# ifdef  __USE_GNU
#  define assert_perror(errnum)            
  (!(errnum)                
   ? __ASSERT_VOID_CAST (0)            
   : __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION))
# endif


/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
   which contains the name of the function currently being defined.
   This is broken in G++ before version 2.6.
   C9x has a similar variable called __func__, but prefer the GCC one since
   it demangles C++ function names.  */
# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
#   define __ASSERT_FUNCTION  __extension__ __PRETTY_FUNCTION__
# else
#  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
#   define __ASSERT_FUNCTION  __func__
#  else
#   define __ASSERT_FUNCTION  ((const char *) 0)
#  endif
# endif


#endif /* NDEBUG.  */




#if defined __USE_ISOC11 && !defined __cplusplus
# undef static_assert
# define static_assert _Static_assert
#endif

assert的定义如下:

C语言

此句意思如下:

expr为真,
执行 __ASSERT_VOID_CAST (0)  ;
否则执行 __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))

条件表达式 ,伪代码:

a?b:c
//如果a为真,执行b;
//如果a为假,执行c

二、测试代码

参数数量为2,则输出参数。否则输出错误信息,并终止程序执行。测试代码如下:

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


int main(int argv,char *argc[])
{
    printf("argv=%dn",argv);
    assert(argv== 2);
    printf("argc[1]=%sn",argc[1]);
    return 0;
}

C语言

C语言

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分