C宏中未定义的变量错误(用于自定义打印)

时间:2013-10-20 10:50:01

标签: c

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

请帮忙,我做错了什么?此外,如果有人可以告诉我是否有更优雅的方式如上所述定制打印报表,它表示赞赏。提前谢谢。

2 个答案:

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