打印

C语言无简单代码

[复制链接]
1806|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2011-1-12 03:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Simon21ic 于 2011-1-12 03:17 编辑

简单代码:
int allow_transports(struct command_context *ctx, const char **vector)
{
....
while (*vector)
   LOG_DEBUG("allow transport '%s'", *vector++);
....
}

vector是一个字符串数组,第一个不是NULL,最后一个是NULL。

#define LOG_DEBUG(expr ...) \
  do { \
   if (debug_level >= LOG_LVL_DEBUG) \
    log_printf_lf(LOG_LVL_DEBUG, \
     __FILE__, __LINE__, __func__, \
     expr); \
  } while (0)

LOG_DEBUG是判断调试等级,如果大于LOG_LVL_DEBUG,就调用log_printf_lf打印调试信息。

首先:
这个那么简单的代码,还是有问题的。
建议:
用比AnsiC还要简化的PlainC,无任何“花哨”的写法,出问题的几率最小。
C语言的最高等级:
忘记,忘记优先级,忘记自增自减的先后顺序,把PlainC可以解决的问题,都忘记了。。。
当然,还有其他的经验,比如宏的所有参数,都带()。{}不省略。宏定义中的do{}while(0)等等。

相关帖子

沙发
batsong| | 2011-1-12 08:54 | 只看该作者
宏定义中的do{}while(0)  神马作用?

使用特权

评论回复
板凳
nevsayno| | 2011-1-12 09:18 | 只看该作者
请楼主解释一下,这段代码有何问题?

使用特权

评论回复
地板
Simon21ic|  楼主 | 2011-1-12 12:41 | 只看该作者
宏定义中的do{}while(0)  神马作用?
batsong 发表于 2011-1-12 08:54


去掉do{}while(0)的话,如果这样呢?
if (......)
    LOG_DEBUG(...);
else
    LOG_DEBUG(...);

使用特权

评论回复
5
kumosheng| | 2011-1-12 18:27 | 只看该作者
搞不懂!

使用特权

评论回复
6
yuyixuanta| | 2011-1-12 19:56 | 只看该作者
不要在宏里面使用自加自减之类的运算符。这是禁忌。

使用特权

评论回复
7
yuyixuanta| | 2011-1-12 19:57 | 只看该作者
2# batsong 保证宏只会被调用一次。
保证宏可以当做表达式来使用。

使用特权

评论回复
8
wangjun403| | 2011-1-12 20:33 | 只看该作者
证宏可以当做表达式来使用。

使用特权

评论回复
9
catch2000| | 2011-1-12 22:22 | 只看该作者
搞不懂楼主要表达什么。
不过宏定义,确实特别有用!!
在嵌入式编程中,尤其是!

使用特权

评论回复
10
Simon21ic|  楼主 | 2011-1-12 22:37 | 只看该作者
本帖最后由 Simon21ic 于 2011-1-12 22:40 编辑

++,--在宏里面,容易碰到宏多次引用参数的问题。
不过这里不是这个问题,目前还没有人完全清楚表述出问题。
不过,确实是++的问题,改成PlainC标准,就没问题了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝