我有下一个调试宏,它工作正常:
#ifndef NDEBUG
#define errorLog(fmt, ...) fprintf(stderr, "[ERROR %s: %d] " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
#endif
除非我尝试下一行(产生预期的')'错误):
const char* someMessage = "Message";
errorLog(someMessage);
但是这个没有产生任何错误:
errorLog("Message");
现在我解决这个问题:
const char* someMessage = "Message";
errorLog("%s", someMessage);
如何更改宏以使用单个const char*
参数?
const char* someMessage = "Message";
errorLog(someMessage); //fprintf(stderr, someMessage)
答案 0 :(得分:4)
如上所述,您的errorLog
需要第一个(fmt
)参数的字符串文字,因为它尝试使用字符串连接,这仅适用于字符串文字。如果你想要一个可以接受任何char *
的宏,而不仅仅是一个字符串文字,你必须直接使用它,而不是粘贴。你可以使用类似的东西:
#define errorLog(...) \
(fprintf(stderr, "[ERROR %s: %d] ", __FUNCTION__, __LINE__), \
fprintf(stderr, __VA_ARGS__), \
fprintf(stderr, "\n"))
这适用于任何char *
,但如果您关心它,则不会有相同的返回值。这也有一个好处,它不依赖于gcc , ## __VA_ARGS__
扩展,这可能不适用于其他编译器。
如果您希望在多线程程序中正常工作,则可能需要:
#define errorLog(...) \
(flockfile(stderr), \
fprintf(stderr, "[ERROR %s: %d] ", __FUNCTION__, __LINE__), \
fprintf(stderr, __VA_ARGS__), \
fprintf(stderr, "\n"), \
funlockfile(stderr))
代替