fprintf()的跨平台宏包装器

时间:2016-02-02 17:29:46

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

是否有一种跨平台的方法来包装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年使用它),但它在2012年之前的Visual Studio版本中失败,因为我实际上没有可变参数列表,即:

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

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

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

有没有直接的方法让这个包装器宏通过宏技巧在Linux(GCC)和Windows(MSVC 2005及以后版本)中工作?

谢谢。

1 个答案:

答案 0 :(得分:3)

无需扩展:

#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.");