我正在尝试制作一个自定义printf,它打印文件/行号以及错误消息,具体取决于当前的打印级别设置。我已经为它定义了一个宏。下面给出了预处理器的代码:
#define DIE (s) \
printf(s); \
exit(0); \
#define my_print(level,s) \
if(level <= gPrintLevel) \
{ \
char *buffer = (char *)malloc(strlen(s)-1); \
if (NULL != buffer) \
{ \
sprintf(buffer,s); \
printf("[%s][%d]:%s\n",__FUNCTION__,__LINE__,buffer); \
if (level == fatal) \
{\
DIE(s);\
}\
} \
} \
我在函数内部调用上述预处理器:
myPrint(2,"Unexpected error encountered\n");
但是,当我尝试编译时,我收到了以下编译错误:
41: error: ‘s’ was not declared in this scope
请帮忙,我做错了什么?此外,如果有人可以告诉我是否有更优雅的方式如上所述定制打印报表,它表示赞赏。提前谢谢。
答案 0 :(得分:4)
就个人而言,我只是假设或要求用户提供 literal 格式字符串。在这种情况下,您可以连接字符串:
#define MYPRINT(fmt, ...) \
printf("Function: %s. Line: %d. " fmt "\n", \
__FUNCTION__, __LINE__, ## __VA_ARGS__);
用法:
MYPRINT("The flargle %d has unexpected grobule %f", f->q, f->r);
这种方法还可以让您利用编译器静态分析格式字符串的能力,并警告您不匹配的参数。
(如果参数列表为空,代码使用涉及##
的GCC扩展名来删除最后一个逗号。)
答案 1 :(得分:0)
好的感谢所有帮助人员,可变参数宏解决方案工作正常。这是宏的新定义:
#define DIE(fmt) \
do { \
printf(fmt); \
exit(0); \
} while(0); \
#define my_print(x,fmt,...) \
if (x < gPrintLevel) \
{ \
printf("[%s][%u]:" fmt "\n",__FUNCTION__,__LINE__,##__VA_ARGS__); \
if (fatal == x) \
{\
DIE(fmt) \
}\
} \