C fprintf()的跨平台宏包装器

C fprintf()的跨平台宏包装器,c,visual-studio,gcc,c-preprocessor,variadic-macros,C,Visual Studio,Gcc,C Preprocessor,Variadic Macros,是否有一种跨平台的方法来包装fprintf(),这样我就可以使用一个简单的日志功能将日志转储到文件或控制台,并使用一个简单的Cprintf()样式格式字符串和参数列表 现在,我正在做这样的事情: #define logIssue(fmt, ...) do { \ fprintf(stderr, "MY_PREFIX:%s:%s:%d > " fmt "\n", __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \ } while(0

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

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

#define logIssue(fmt, ...) do { \
    fprintf(stderr, "MY_PREFIX:%s:%s:%d > " fmt "\n", __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \
} while(0);
这在GCC中起作用,如果我删除了前面的
##
,它在GCCVisual Studio 2005中起作用(是的,我必须让它在VS2005上一直工作到2015年),但在2012年之前的Visual Studio版本中它失败,因为我实际上没有变量参数列表,即:

logIssue("Problem with test#%d.", iTestID); // Succeeds
logIssue("General problem."); // Fails
我详细阅读了本期,包括以下内容:

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

有没有任何简单的方法可以让这个包装器宏通过宏技巧在Linux(GCC)和Windows(MSVC 2005及以后)中工作


谢谢。

不需要扩展:

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

你能使用多少C99?@fuzzxl因为我必须支持VS2005到2015年,所以我不能真正依赖C99。至少对于GCC来说,我的约束要宽松得多。谢谢。我将最后的
fputs
调用与
fprintf(stderr,“\n”)
进行了交换,一切就绪: