【问题标题】:Is there any good reason not to use 'define' with variable argument length?是否有充分的理由不使用具有可变参数长度的“定义”?
【发布时间】:2013-02-07 20:12:08
【问题描述】:

最近我发现了这段代码:

#define LOG(type, str)                      printf(str)
#define LOG1(type, str,arg1)                printf(str,arg1)
#define LOG2(type, str,arg1,arg2)           printf(str,arg1,arg2)
#define LOG3(type, str,arg1,arg2,arg3)      printf(str,arg1,arg2,arg3)
#define LOG4(type, str,arg1,arg2,arg3,arg4) printf(str,arg1,arg2,arg3,arg4)

代码是最近写的。所以我猜它可以用C99编译。

我的问题是:为什么不使用具有可变参数长度的简单宏?我们只会限制自己使用LOG 宏,仅此而已。更不用说我们不必添加LOG5LOG6 等。如果我们得到堆栈跟踪、内存不足等任何可以使这个解决方案有用的东西,会不会发生可怕的事情?

我是一个极简主义者,如果我们能得到更少的线条就更好了。但是我在这里错过了什么吗?这是故意的还是一种糟糕的编码习惯?

【问题讨论】:

  • AFAIK 如果代码不是针对 C99,那么这是您编写宏的唯一方法。另外:我不知道为什么这不是一个函数。
  • @Jon,假设您不想登录发布版本,您可以节省整个函数调用事件。让我们不要走__naked__。哦,这也会擦除日志行的所有字符串文字
  • @RomanSaveljev:你必须先让我相信,保存函数调用 很重要。 :-)
  • @Jon 没有宏就无法获得调用的__LINE__,除非您将其写入每次调用,而且每次都写入log(__FILE__, __LINE__, ...) 可能会令人不安。
  • @Jon Oh-oh.. 我为这样的遭遇准备了适当的咒语:管道冲洗!缓存未命中!功能内联无保证!卡达布拉!!

标签: c c-preprocessor variadic-functions


【解决方案1】:

对可变参数宏的预处理器支持在我看来是唯一的好理由。我们的项目 LOG, LOG1 etc 使用了几十年,但最近确实升级到了 ...

根据维基百科:

一些编译器在编译 C 和 C++ 代码时支持可变参数宏:GNU Compiler Collection 3.0、[2] Visual Studio 2005、[3] C++Builder 2006 和 Oracle Solaris Studio(以前称为 Sun Studio)Forte Developer 6 更新 2(C++ 版本 5.3)。[5] GCC 在编译 Objective-C 时也支持此类宏。

如果您了解自己的平台,请使用花哨的可变参数宏。如果支持的人很少,那么事情可能会变得更有趣

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多