清洁调试输出功能?

时间:2011-01-19 12:11:27

标签: c debugging c-preprocessor

我想写一个函数,它会在我的程序中打印出错误消息/警告以及文件&电话号码。 C

中有这两个宏
__FILE__
__LINE__

但是我认为存在问题......当我写这样的函数时:

#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void error(const char *location, const char *msg)
{
#ifdef DEBUG
  printf("Error at %s: %s\n", location, msg);
#endif
}
int main(int , char**)
{
  error(AT, "fake error");
  return 0;
}

还有很多无用的函数调用&amp;垃圾邮件(每次调用时__FILE____LINE__的值)在二进制文件中,即使我为发布版本取消DEBUG取消定义。 那么我怎样才能更优雅呢?我想要这样的东西:

#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void error(const char *location, const char *msg)
{
  printf("Error at %s: %s\n", location, msg);
}
int main(int , char**)
{
#ifdef DEBUG
  error(AT, "fake error");
#endif
  return 0;
}

但不是在每次函数调用之前和之后编写#ifdef DEBUG#endif - 这对于这样的任务来说太大了。并且手动删除每个error(AT, "fake error");调用也不是很优雅......

有什么想法吗?也许内联函数(不会有帮助,不是吗)?一些宏观或这种结构的变化?

5 个答案:

答案 0 :(得分:3)

只需将error转换为宏:

#ifdef DEBUG
# define ERROR(l, m) error(l, m)
#else
# define ERROR(l, m)
#endif

然后,在你的函数中,写

ERROR(AT, "fake error");

当然,您也可以简化ERROR并删除AT作为第一个参数,直接在宏定义中指定此信息。

答案 1 :(得分:2)

您可以使用此可变参数宏来模仿printf,它会将文件和行号写入所需的输出。

#define eprintf(...) do {fprintf(stderr, "%s:%d: ", __FILE__, __LINE__);\
 fprintf(stderr, __VA_ARGS__);} while(0)

编辑:根据jcsalomon

的建议修改eprintf

答案 2 :(得分:2)

在宏中包装error()确实是正确的方法 - 我会这样写:

#ifdef DEBUG
static void error(const char *file, long line, const char *msg)
{
  fprintf(stderr, "Error (%s:%ld): %s\n", file, line, msg);
}
#define error(msg) (error)(__FILE__, __LINE__, msg)
#else
#define error(msg) ((void)0)
#endif

答案 3 :(得分:1)

#ifdef DEBUG
#define ERROR(msg) error(AT, msg)
#else
#define ERROR(msg)
#endif

int main( int argc, char * argv[] )
{
   ERROR( "fake error");
   return 0;
}

答案 4 :(得分:1)

用#define

替换错误

类似的东西:

#ifdef DEBUG
#define error(a,b) printf("Error at %s: %s\n", (a), (b))
#else
#define error(a,b) 
#endif

你也可以将AT移入错误而不是每次传递