使用__LINE__获取代码行

时间:2011-10-28 12:33:05

标签: c++ c macros

我尝试使用以下方法打印当前代码的行号:

#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

4 个答案:

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