分享

GLIB库:调试宏——前提条件检查

 217小月月坑 2015-02-15

glib提供了一整套宏,在你的代码中使用它们可以强制执行不变式和前置条件。这些宏很稳定,也容易使用,因而Gtk+大量使用它们。定义了 G_DISABLE_CHECKSG_DISABLE_ASSERT之后,编译时它们就会消失,所以在软件代码中使用它们不会有性能损失。大量使用它们能够更快速地发现程序的错误。发现错误后,为确保错误不会在以后的版本中出现,可以添加断言和检查。特别是当编写的代码被其他程序员当作黑盒子使用时,

这种检查很有用。用户会立刻知道在调用你的代码时发生了什么错误,而不是猜测你的代码中有什么缺陷。

当然,应该确保代码不是依赖于一些只用于调试的语句才能正常工作。如果一些语句在生成代码时要取消,这些语句不应该有任何副作用。

 

  宏列表:前提条件检查

 

  #include<glib.h>

g_return_if_fail(condition)

g_return_val_if_fail(condition,retval)

 

  这个宏列表列出了glib的预条件检查宏。对g_return_if_fail(),如果条件为假,则打印一个警告信息并且从当前函数立刻返回。 g_return_val_if_fail()与前一个宏类似,但是允许返回一个值。毫无疑问,这些宏很有用—如果大量使用它们,特别是结合Gtk+的实时类型检查,会节省大量的查找指针和类型错误的时间。

使用这些函数很简单,下面的例子是glib中哈希表的实现:

 

  void

g_hash_table_foreach(GHashTable*hash_table,

GHFuncfunc,

gpointeruser_data)

{

GHashNode*node;

ginti;

g_return_if_fail(hash_table!=NULL);

g_return_if_fail(func!=NULL);

for(i=0;i<hash_table->size;i++)

for(node=hash_table->nodes[i];node;node=node->next)

(*func)(node->key,node->value,user_data);

}

 

  如果不检查,这个程序把NULL作为参数时将导致一个奇怪的错误。库函数的使用者可能要通过调试器找出错误出现在哪里,甚至要到glib的源代码中查找代码的错误是什么。使用这种前提条件检查,他们将得到一个很不错的错误信息,告之不允许使用NULL参数。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多