dolphin836 发表于 2012-10-25 13:54

通过传递参数开启调试信息这样做好不好?

我linux下编写的c程序

要运行在arm中

我想通过在启动的时候是否传入参数来控制是否打印调试信息

我的做法如下:

定义全局变量debug

如果运行程序时参数个数大于1 就将第二个参数赋给debug

程序中的打印信息都使用if(debug)
{
      printf("test \n");
}
这样的形式

下面是一个完整的例子:
#include <stdio.h>

int debug = 0;

int main(int argc, char *argv[])
{
        printf("Hello World! \n");
        if(argc > 1)
                debug = argv;
        if(debug)
                printf("************ \n");

        return 0;
}
编译后,输入:/a.out    输出:Hello World!

如果输入:/a.out 1      
输出:Hello World!
************


我想问大家,这样做好不好?有什么弊端?

我的另一种方式是在程序中定义一个宏#define DUBUG 1使用如下方式打印调试信息:#if DEBUG
       printf("test \n");
#endif这样中的缺点是,需要修改源代码后编译,才可以控制。

dolphin836 发表于 2012-10-25 14:17

个人理解如下:
1 全局变量方式在每次调用的地方都会进行if判断
2 宏方式,在预处理的时候就已经将代码中的DEBUG替换成1了,所以代码在打印的地方只是执行了一条普通的语句。

不知是否正确?

linux_c_py_php 发表于 2012-10-25 14:46

... 你能分清楚宏和变量的区别吗...

你每个printf都写个#if你不累吗?

dolphin836 发表于 2012-10-25 16:06

宏 其实不属于代码的一部分
在对代码进行编译前有预处理,会将程序中所有的宏替换成定义的值
例如#define DEBUG 1那么代码中的:if(DEBUG)就会被写成if(1);

每次都用#if DEBUG的确很烦
其实可以使用宏定义一个自己的print函数,例如dprintf();
大概的代码如下:#define DEBUG
#ifdef DEBUG
   #define dprintf(...) printf(...)
#else
    #define dprintf(...)
#endif这么写好像有一些问题,有点搞不清楚变长参数。
回复 3# linux_c_py_php


   

linux_c_py_php 发表于 2012-10-25 16:11

那去学一下vprintf系列函数以及stdarg.h
页: [1]
查看完整版本: 通过传递参数开启调试信息这样做好不好?