fprintf宏与单个param期待')'

时间:2014-05-03 12:27:16

标签: c macros

我有下一个调试宏,它工作正常:

#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)

1 个答案:

答案 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))

代替