使用__LINE__获取代码行

dai*_*isy 4 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;
}
Run Code Online (Sandbox Code Playgroud)

但我总是得到错误的行号,它应该是10代替5,我该如何解决这个问题?

我也尝试使用一些宏:

#define ERR (msg) do { printf ("%s : %d\n" , msg , __LINE__); } while (0)

并导致错误: msg not declared

Jac*_*kin 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;
}
Run Code Online (Sandbox Code Playgroud)

更好的方法是将这种方法的调用定义为,如下所示:

#define PRINTERR(msg) err((msg), __LINE__)
Run Code Online (Sandbox Code Playgroud)


Ed *_*eal 8

#define ERR(msg) printf("%s : %d", (msg), __LINE__)
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

你不需要这个功能!


Eva*_*ski 6

__LINE__获取当前行,表示调用它的行.您需要将其作为参数传递:

ERR ("fail..", __LINE__);
Run Code Online (Sandbox Code Playgroud)

否则它将始终是您的错误函数中的行,在您的示例中为5.更改您的函数以接受宏的int类型__LINE__.

我会使用@Ed Heal回答的宏.另外,你得到"msg not declared"的原因是宏中的变量需要括在括号中(即(msg)).因为宏的名称和括号之间有一个空格来启动参数列表.

  • 将msg括在括号中是个好主意,因为msg可能是一个表达式.不确定在这种情况下是否有必要,但这是一个很好的经验法则. (2认同)