断言 assert(表达式) 相关概念​

本文部分内容来自《C和指P342

断言就是声明某种东西应该为真。ANSI C 现了一个 assert 它在调试程序时很有用。它的原型如下所示:

void assert( int expression );

当它被执行时,这个宏对表达式参数进行测试。如果它的值为假,它就向标准错误打印一条诊断信息并终止程序。 这条信息的格式是由编译器定义的,但它将包含这个表达式所在的源文件的名字以及断言所在的行号。如果表达式为真,它不打印任何东西,程序继续执行。用这种方法使用断言使调试程序变得更容易,因为一旦出现错误, 程序就会停止。而且,这条错误提示信息会准确地提示了症状出现的地点。

这个宏提供了一种方便的方法,对应该为真的东西进行检验。例如:如果一个函数必须使用一个不能为 NULL 的指针参数进行调用,那么函数可以用断言验证这个值:assert( value != NULL );” 如果函数错误的接受 了一个 NULL 数,程序就会打印一条类似下面形式的信息:

Assertion failed: != NULL, file.c line 214

当程序被完整的测试完毕之后,你可以在编译时通过定义 NDEGUG 除所有的断言。你可以使用-DNDEBUG

编译器命令行选项 或者 在源文件中头文件 assert.h 包含之前增加下面这个定义:

#define NDEBUG

当 NDEBUG 定义之后,预处理器将丢弃所有的断言,这样就消除了这方面的开销,而不必从源文件中把所有 的断言实际删除。

#include
#include
//#define NDEBUG
#include
void my_strcopy(char *dest,char *src )
{
    assert(src != NULL);
    assert(dest != NULL);
    assert(strlen(src) >= strlen(dest));
 
    while((*dest++ = *src++) != '\0');
}
 
int main()
{
    char str1[] = "0123456789";
    char str2[] = "abcdefghijk";
 
    printf("原始字符串:\n%s\n%s\n",str1,str2);
    my_strcopy(str1, str2);
    printf("拷贝后的字符串:\n%s\n%s\n",str1,str2);
 
    getchar();
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

148 views 暂无评论