我尝试使用以下方法打印当前代码的行号:
#include <stdio.h>
void err (char *msg)
{
printf ("%s : %d" , msg , __LINE__);
}
int main ( int argc , char **argv )
{
ERR ("fail..");
return 0;
}
但我总是得到错误的行号,它应该是10
而不是5
,我该如何解决这个问题?
我也尝试使用一些宏:
#define ERR (msg) do { printf ("%s : %d\n" , msg , __LINE__); } while (0)
并导致错误:msg not declared
答案 0 :(得分:10)
__LINE__
会为您提供显示的行, 始终 第5行。
要完成这项工作,您需要将__LINE__
作为单独的参数传递。
#include <stdio.h>
void err (char *msg, int line)
{
printf ("%s : %d" , msg , line);
}
int main ( int argc , char **argv )
{
err("fail..", __LINE__);
return 0;
}
更好的方法是将这种方法的调用定义为宏,如下所示:
#define PRINTERR(msg) err((msg), __LINE__)
答案 1 :(得分:8)
#define ERR(msg) printf("%s : %d", (msg), __LINE__)
应该做的伎俩。
你不需要这个功能!
答案 2 :(得分:6)
__LINE__
获取当前行,表示调用它的行。您需要将其作为参数传递:
ERR ("fail..", __LINE__);
否则它将始终是您的错误函数中的行, 5 在您的示例中。更改您的功能以接受int
宏的__LINE__
类型。
我会使用@Ed Heal回答的宏。此外,你得到“msg not declared”的原因是,宏中的变量需要括在括号中(即因为宏的名称和用于启动参数列表的括号。(msg)
)。
答案 3 :(得分:0)
您可以将ERR
设为宏:
#define ERR(msg) fprintf(stderr, "ERROR on line %d: %s\n", __LINE__, (msg))