2

我正在尝试制作一个自定义 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

请帮忙,我做错了什么?此外,如果有人可以告诉我是否有更优雅的方式来定制上述打印语句,我们将不胜感激。提前致谢。

4

2 回答 2

4

就个人而言,我只是假设或要求用户提供文字格式字符串。在这种情况下,您可以连接字符串:

#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 扩展##来省略最后的逗号,以防参数列表为空。)

于 2013-10-20T10:53:40.740 回答
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) \
    }\
} \
于 2013-10-20T13:01:20.310 回答