为什么你甚至需要它作为一个字符串?整数有什么问题?这里有两种方法,你可以写logError()
:
#define logError(str) fprintf(stderr, "%s line %d: %s\n", __FILE__, __LINE__, str)
// Or, forward to a more powerful function
#define logError(str) logError2(__FILE__, __LINE__, str)
void logError2(const char *file, int line, const char *str);
如果你真的需要行作为字符串,可以使用字符串化操作#
,但由于宏方式工作的,你需要把它包起来的两个宏:
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#define LINE_STRING STRINGIZE(__LINE__)
现在LINE_STRING
是将扩大到包含无论它扩张时,当前的行号的字符串的宏。如果您只有一级宏(即如果您有#define STRINGIZE(x) #x
),那么每次扩展它时都会得到字符串"__LINE__"
,这不是您想要的。
虽然这是一个旧的线程,但您希望它作为字符串的原因是您不能使用fprintf()的实例。一个这样的地方是在一个信号处理程序中,因为在write()时,fprintf()在信号处理程序中不安全。 – Bob9630 2014-04-11 18:43:20