燕青专栏

读书笔记及技术探讨

原创 几个在unix/linux平台比较有用的宏收藏

   在unix/linux平台,对函数的返回值,一般有这样一个规则。如果成功,返回>=0的值,否则返回-1。我们在每次获取返回值后,都会不厌其烦的检测是否为-1,并且打印出对应的错误信息。对于少量的函数调用,我们是比较容易接受的,但是对于一个较大的项目,这种经历也是一种痛。
   那么我们是否可以通过宏来完成这些工作呢?因为宏看上去很简单明了,在使用的时候也可以通过开关选项来控制,对于调试和性能方面的处理是比较有利的。我这里介绍一个简单的宏,希望给网友一些有益的提示!
#ifndef NDEBUG

#define checkFun( fn )  ({                                                                                                \
    int __result = (fn);                                                                                                         \
    if ( __result == -1 )                                                                                                       \
    {                                                                                                                                       \
        char __err[ 512 ];                                                                                                      \
        snprintf( __err, sizeof( __err ), "[%s:%d:%s]", __FILE__, __LINE__, #fn );  \
        perror( __err );                                                                                                          \
    }                                                                                                                                       \
    assert( __result != -1 );                                                                                              \
    __result;                                                                                                                       \
    })

#else

#define checkFun( fn )  (fn)

#endif

上面的宏有几个地方值得注意:
  • 使用了非ANSI C函数snprintf,如果库中没有提供相应函数,可以使用sprintf来替换,代价是可能会出现完全隐患。
  • 对于POSIX函数,当成功时,0返回,否则相关错误代码会返回。我们不能使用perror函数来打印出错误信息,因为errno没有被使用。那么在这种情况下,如何使用这个宏呢?请看下面的pwrap宏。
#define pwrap( fn )     ({  \
    int __result = (fn);    \
    if ( __result != 0 )    \
    {                       \
        errno    = __result;\
        __result = -1;      \
    }                       \
    __result;               \
    })
我们把posix标准的返回转化成unix/linux下常用的返回方式,便于checkFun的使用。我是一个比较怕麻烦的人,对于嵌套使用两个宏是很有意见的,我希望是仅仅使用一个宏,如何解决呢?很简单,我门在定义一个类似checkFn的宏,做对于posix标准函数的返回检查。

#define pcheckFun( fn )   checkFn( pwrap( fn ) )

在多线程或者多进程环境中,一定要保证errno是多线程或进程安全的,所以我们在Makefile中要加入_REENTRANT宏。详细信息请参考:如何让errno多线程/进程安全

发表于 @ 2006年09月12日 10:29:00|评论(loading...)|收藏

新一篇: IDE - Hardware Reference & Information Document | 旧一篇: 如何使read和write操作不受平台干扰

用户操作
[即时聊天] [发私信] [加为好友]
燕青
订阅我的博客
XML聚合  FeedSky
文章分类
收藏
    c/c++优秀网站
    boost
    c/c++ Reference
    C99标准
    Effective STL 中文版
    stlport
    stlsgi
    编程爱好者
    eBook
    rinet
    Excel/VBA
    VBA参考手册
    VBA自由代码库
    Linux GNU
    GNU Libs HOWTO
    Linux GUI
    QT中文论坛
    MICOM
    AVR MICRO
    WinAVR Tutorial
    MSND
    MSDN在线帮助
    web聊天网
    查看MSN联系人状态
    ebuddy
    iloveim
    imhaha
    meebo
    meebo11
    Web MSN
    米博
    澳洲移民
    前程专业留学移民公司
    百科全书
    QWika
    vesa标准
    wikipedia
    电子元器件网站
    eeworld
    好友链接
    Anders New Blog
    Anders的博客
    Anders的网站
    全胜花的生命痕迹
    小葛的博客
    尧的快乐一家
    捷仔的博客
    老郭的博客
    老钱的博客
    金种子母婴生活馆
    阿耀的博客
    家用网站
    上海移动通信
    中国电信网上营业厅
    金融网站
    纳斯达克
    开源网站
    apache
    opensource
    SVN
    垮平台GUI
    microwindows
    wxWidgets
    敏捷编程
    agilejournal
    extremeprogramming
    jayasoft
    maven
    上海四金网
    上海住房公积金网
    上海养老保险网
    上海医保网
    万年历
    21page万年历
    百渡万年历
    网页脚本教程
    DynamicDrive
    PageSource
    网站交换
    刘韧交换链接网站
    英语听力
    VOA慢速英语
    海词字典
    英语中级听力
    语高级听力
    优秀UNIX/LINUX网站
    IBM Linux论坛
    opengroup
    perl
    pthread
    socket
    UNIX Specification
    unix标准大全
    永远的UNIX
    存档
    Csdn Blog version 3.1a
    Copyright © 燕青