【发布时间】:2012-08-27 14:57:04
【问题描述】:
我的桌面上有一个 linux 应用程序正在运行,我想将 syslog() 调用重定向到 printf() 调用。
注意:我确实不想替换调用,只是重定向
所以我写了一些代码来做到这一点:
#ifndef EMBED
#define syslog(level, stuff) printf("SYSLOG: %s\n", stuff)
#endif
在我使用它的一个文件中效果很好。我把它移到了一个新文件中并得到了一个错误:
error: macro "syslog" passed 3 arguments, but takes just 2
我知道错误是因为新文件中的调用是混合的,有些使用 2 个参数到 syslog,有些使用 3 个。我也知道我需要通过可变参数列表以某种方式重定向它,但我该怎么做做这个?我还没弄好...
据我了解,syslog() 和 printf() 应该是:
void syslog(int priority, const char *format, ...)
int printf(const char *format, ...)
所以我尝试了:
#define ERR 3
#ifndef EMBED // This is not defined in my env, btw
#define syslog(pri, fmt, ...) printf(fmt, ...)
#endif
...
void main() {
...
syslog(ERR, "test");
但这给出了错误:
error: expected expression before ‘...’ token
关于这个宏的外观/使用方式的建议?
【问题讨论】:
-
宏无济于事除非您可以保证
fmt参数将始终是字符串文字。 -
使用宏是替换调用,而不是重定向。如果您只想重定向,您可能需要使用 RTLD_NEXT 查看 LD_PRELOAD。