【问题标题】:Cross-platform macro wrapper for fprintf()fprintf() 的跨平台宏包装器
【发布时间】:2016-05-11 15:28:45
【问题描述】:

是否有一种跨平台的方法来包装fprintf(),这样我就可以拥有一个简单的日志记录功能,用于将日志转储到文件或控制台,并使用简单的 C printf() 样式格式字符串和参数列表?

现在,我正在做这样的事情:

#define logIssue(fmt, ...) do { \
    fprintf(stderr, "MY_PREFIX:%s:%s:%d > " fmt "\n", __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \
} while(0);

这在 GCC 中有效,如果我删除前导 ##,它在 GCC Visual Studio 2005 中有效(是的,我必须在 VS2005 到 2015 年之前让它在 VS2005 上工作),但它当我实际上没有变量参数列表时,在 2012 年之前的 Visual Studio 版本中失败,即:

logIssue("Problem with test#%d.", iTestID); // Succeeds
logIssue("General problem."); // Fails

我已经详细阅读了这个问题,包括以下内容:

这些提供了潜在的解决方案,但我似乎无法将它们与我的 fprintf() 宏集成。

是否有任何直接的方法可以通过宏技巧让这个包装宏在 Linux (GCC) 和 Windows(MSVC 2005 及更高版本)中工作?

谢谢。

【问题讨论】:

  • C99 能用多少?
  • @FUZxxl 因为我必须支持 VS2005 到 2015 年,所以我不能真正依赖 C99。至少对于 GCC,我的限制要宽松得多。

标签: c visual-studio gcc c-preprocessor variadic-macros


【解决方案1】:

不需要扩展:

#define logIssue(...) do {      
    fprintf(stderr, "MY_PREFIX:%s:%s:%d > ", __func__, __FILE__, __LINE__);
    fprintf(stderr, __VA_ARGS__ );
    fputs( "", stderr);
} while(0)

这适用于两个调用,并且符合 C99:

logIssue("Problem with test#%d.", iTestID);
logIssue("General problem.");

【讨论】:

  • 谢谢。我用fprintf(stderr, "\n") 交换了最后一个fputs 电话,我已经准备好了。 :)
猜你喜欢
  • 2011-12-22
  • 2011-03-11
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
相关资源
最近更新 更多