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/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense 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 anerror 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 standardcompliance. */
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 extraparentheses around EXPR. Otherwise, those added parentheses wouldsuppress warnings we'd expect to be detected by gcc's -Wparentheses. */
# if defined __cplusplus
# define assert(expr) \(static_cast <bool> (expr) \? 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 tosupport function pointers and bit fields in this context, and tosuppress 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 sinceit 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的定义如下:
此句意思如下:
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=%d\n",argv);assert(argv== 2);printf("argc[1]=%s\n",argc[1]);return 0;
}
欢迎关注公众号:嵌入式学习与实践