- 经典断言
- C11静态断言
感觉现在很多人都不用assert了,毕竟IDE都这么智能。assert的功能也非常简单,如果输入一个0(False),那么就会打印一条错误信息。
#include#include int main(){ assert(1); assert(0); }
这样一个简单的案例,在命令行中通过gcc编译,果然在第6行报错了。
E:documents001101>gcc assert1.c E:documents001101>a.exe Assertion failed: 0, file assert1.c, line 6
查看insert.h的源文件,会发现下面几行代码
#undef assert //取消已有的assert定义 #ifdef NDEBUG #define assert (test) ((void)0) #else #define assert (test) ... #endif
这说明,当NDEBUG被定义的时候,会将assert自动转化为一个空函数,从而取消断言。
gcc中-D指令可以添加宏代码,则下面的代码并不会报错
E:documents001101>gcc -DNDEBUG assert1.c E:documents001101>a.exeC11静态断言
assert的功能非常简单,我们可以用条件语句写一个类似的函数
void assertIf(int i){
if(!i){
printf("error");
abort(); //自stdlib中调用,可终结函数
}
}
assert的好处是,可以自动返回出错的行数,并且能够通过define NDEBUG将其禁止。
但assert也有不足,即只能在运行时执行。C11推出了一个新的函数_Static_assert,顾名思义为静态断言,可以在编译时执行:
//sa.c
#include
int main(){
_Static_assert(0);
}
结果为
E:documents001101>gcc sa.c sa.c: In function 'main': sa.c:10:2: error: static assertion failed: "ERROR" _Static_assert(0,"ERROR");



