我想写一个函数,它会在我的程序中打印出错误消息/警告以及文件&电话号码。 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");
调用也不是很优雅......
有什么想法吗?也许内联函数(不会有帮助,不是吗)?一些宏观或这种结构的变化?
答案 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移入错误而不是每次传递