[开发过程]宏函数及调试

    在使用了大量的宏来快速构建函数后,一个问题出现了:如果你发现某个地方出了bug,你得定位它,于是使用debugger,然而宏的“简易”导致你进行了许多次“下一步”还是停留在使用宏的那一行。

    当然也不是完全没办法,如果你曾经接触过Python语言,并且听说过“Python语言八荣八耻”,那么你应该对这句话有印象——以打印日志为荣,以单步跟踪为耻。虽然我不太明白为什么Python语言有这样的论调,不过至少在使用宏的时候,这一点是非常值得借鉴的。废话少说,先来个实现:

#define shift(current, encounter, target)                                 \
    static void linkName(current, encounter)(struct LRAnalyser* self,     \
                                             struct Token* t)             \
    {                                                                     \
        self->stateStack->push(self->stateStack, jerryLRStates + target); \
        printf(#current                                                   \
               " encouters "                                              \
               #encounter                                                 \
               " shift to "                                               \
               #target                                                    \
               "\n");                                                     \
    } /*******************************************************************/

这里展示的是在原来的宏shift内部增加一个输出语句,输出当前状态名、遭遇的符号类型、目标状态名。有了这些信息,LR分析器每一次移进你都不会错过——记得在那几个特殊的移进函数中也插入类似代码。如果有需要,也可以插入其他输出函数,把它们都塞进宏内部。不过注意版式,或者输出到特定的文件以保护视力。

 

    说到跟踪调试和打印日志,围绕这个话题有很多争论。单步跟踪直观,而且不会破坏程序的执行,但是如果有一个很长的循环,比如循环1000次(这还不算很长吧),其中某些情况下会有故障发生,那么跟踪这个循环会让人厌倦于“下一步”和观察变量值;另一方面,一个printf更适合对付那些循环,但是在递归迭代过程中它就显得力不从心了——或者应该说观察输出的程序员往往很难确定到底哪个输出对应于哪一次递归调用——此外安插在代码中间的这些探针在不再需要时,清除它们也是一件很麻烦的事情,也许一不小心把需要的代码也给顺手牵羊了。两种方法应该互补,在恰当的情况下使用;或者,使用你认为可以解决问题的方法。

 

    最后再说说宏。在C语言程序开发过程中,宏大部分情况下是用来伪装一个函数或常数,如EOF以及可变参数函数中用到的va_arg宏,此外还有一些经典的宏用来包装一个函数(可以认为这是Decorator模式的始祖),如assert宏。不过,像LR分析表实现过程中这样用来大段大段生成函数的宏并不多见。可以认为这是一种C语言风格的原始泛型编程,甚至于是一种编译时多态:每个函数都是一个对象,它们之间的差异仅体现在函数名和target成员,而每次调用宏时就如同调用构造函数一样。不过,它们的缺陷是,它们总会在内存中驻留,占用很多空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cognos 11 是一种强大的商业智能工具,它提供了许多功能来帮助用户创建和管理报表、仪表板等业务应用。函数是 Cognos 11 中的一个重要特性,可以帮助用户快速开发复杂的报表和仪表板。 函数是一种类似于脚本的功能,它允许用户定义自己的计算和逻辑,以满足特定的需求。通过使用函数,用户可以自动化处理数据、创建计算字段、执行复杂的数据转换等操作,这样可以大大提高开发效率和数据分析能力。 使用函数的步骤如下: 首先,用户需要在 Cognos 11 中创建一个函数。可以通过单击菜单栏中的“工具”选项,然后选择“管理器”来访问函数编辑器。在编辑器中,用户可以定义的名称、输入参数和输出结果。用户可以使用 Cognos 11 提供的函数库来编写函数的逻辑。 然后,用户需要在报表或仪表板中引用函数。在 Cognos 11 中,用户可以直接在报表设计器或仪表板设计器中使用函数。用户可以通过在计算字段中输入函数的名称来调用它。在报表运行或仪表板展示时,函数将根据用户的定义进行计算,并返回结果。 最后,用户可以根据需要对函数进行修改和调试。在 Cognos 11 中,用户可以使用管理器来编辑、复制和删除函数。用户还可以使用 Cognos 11 提供的调试工具来测试函数的逻辑和数据处理过程,以确保其正确性。 总之,Cognos 11 的函数是一个强大的功能,可以帮助用户在报表和仪表板中实现复杂的数据分析和计算。通过灵活使用函数,用户可以提高数据分析的效率和准确性,从而更好地支持业务决策和发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值