几则笔记
转载时请注明出处:http://blog.csdn.net/absurd
1. 鲁棒原来是robust。
一直以为鲁棒是一种与自动控制相关的高深理论,所以对它敬而远之。今天看了《读林斌博士写好代码十个秘诀》,才知道鲁棒原来就是robust。这个术语可谓翻译史上的败笔,我算服了。咖啡、沙发、坦克之类的音译外来词,中文里没有对应的词语,采用音译是理所当然的。而robust有一大堆词语可以与之对应,采用什么音译!即使把program译成铺肉葛软也不见得比把robust译为鲁棒更荒谬。
希望各位老大不要把这类词语引入软件领域,没有必要在垃圾词汇上显示自己的高深。
2. Glib 线程初始化。
最近一个BUG浪费半天时间。在一个线程里使用g_debug输出调试信息,程序在大多数情况下可以正常工作,偶尔会在g_debug里退出。跟踪到这个函数的代码里,很快发现原来是因为g_debug重入了。
心想,哪有Log函数不能重入的?glib更不会做得这么差吧。再仔细阅读相关代码,原来它们是可以重入的,只是要调用g_thread_init多线程初始化。
为什么没有想到要先调用g_thread_init初始化线程呢?首先是以为gtk_init里面已经调了g_thread_init初始化线程。其次是以为只要不用glib的thread函数就不必调用g_thread_init。结果错了,只要是多线程环境都要调用它。看来我以为这三个字真不是什么东西。
3. 过滤g_debug/g_warning/g_error等输出的调试信息。
glib的log函数不能根据环境变量来设置log过滤级别,也没有提供设置过滤级别的函数。这有些违背常规,所幸的是可以通过另外一个函数实现。下面的这个例子演示了如何过滤debug级别的调试信息:
#include <glib.h> void none_log(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) { return; } int main(int argc, char* argv[]) { GMainLoop* main_loop = g_main_loop_new(NULL, FALSE); g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, none_log, NULL); g_debug("%s:%d", __func__, __LINE__); g_warning("%s:%d", __func__, __LINE__); g_main_loop_run(main_loop); return 0; } gcc -g `pkg-config --cflags --libs glib-2.0` t.c -o t.exe |