zoukankan      html  css  js  c++  java
  • linux注意的一些地方

        assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行

    #include <assert.h>
    void assert( int expression );

      assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行

      已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define     NDEBUG 来禁用assert调用,示例代码如下:

    #include <stdio.h>
    #define NDEBUG
    #include <assert.h>

    用法总结与注意事项:

      1)在函数开始处检验传入参数的合法性如:

          

    int resetBufferSize(int nNewSize)
    {
      //功能:改变缓冲区大小,
      //参数:nNewSize 缓冲区新长度
      //返回值:缓冲区当前长度
      //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
      assert(nNewSize >= 0);
      assert(nNewSize <= MAX_BUFFER_SIZE);
      ...
    }


      2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:

      不好:

    assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

      好:

    assert(nOffset >= 0);
    assert(nOffset+nSize <= m_nInfomationSize);

      3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

      错误:

    assert(i++ < 100);

      这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

      正确:

     assert(i < 100);
    i++;

      4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

      5)有的地方,assert不能代替条件过滤。

    转自:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html

    C/C++中一个'#'和两个'##'的意思:

    原文链接:http://thatax.blog.163.com/blog/static/20892680200882391827116/

    ##(两个井号)和#(一个井号)都是什么意思

    连接符 ##(两个井号)

    不知道什么符 #(一个井号)

    ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释

    #符是把传递过来的参数当成字符串进行替代。

    假设程序中已经定义了这样一个带参数的宏:

    #define PRINT( n ) printf( "token" #n " = %d", token##n )

    同时又定义了二个整形变量:

    int token9 = 9;

    现在在主程序中以下面的方式调用这个宏:

    PRINT( 9 );

    那么在编译时,上面的这句话被扩展为:

    printf( "token" "9" " = %d", token9 );

    注意到在这个例子中,PRINT(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。

    可想而知,上面程序运行的结果就是在屏幕上打印出

    token9=9

    还有点不明白?!

    再来一个例子:

    #define PRINT( n ) printf( "token" #n " = %d", game##n )

    int token9 = 9;

    int game9 = 99;

    调用:

    PRINT(9);

    屏幕上打印出:

    token9 = 99

  • 相关阅读:
    Oracle的分区打点
    学习Struts2经验总结
    优化MVC,实现数据库表的记录的添加、删除、修改、查询。
    基于struts研究传值问题
    基于“MVC”框架集设计模式,开发用户管理系统!
    使用Struts,实现简单的登录
    QT学习4:使用窗口部件
    QT学习9:绘制函数
    QT学习8:准备战斗
    QT学习6:组装丰富的积木!
  • 原文地址:https://www.cnblogs.com/hoojjack/p/3845105.html
Copyright © 2011-2022 走看看