получить строку кода с __LINE__ - PullRequest
4 голосов
/ 28 октября 2011

Я попытался напечатать номер строки текущего кода, используя:

#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 ]

10 голосов
/ 28 октября 2011

__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__)
8 голосов
/ 28 октября 2011
#define ERR(msg) printf("%s : %d", (msg), __LINE__)

Должен сделать свое дело.

Вам не нужна функция!

6 голосов
/ 28 октября 2011

__LINE__ получает строку current , означающую строку, к которой она была вызвана. Вам необходимо передать его в качестве параметра:

ERR ("fail..", __LINE__);

В противном случае это всегда будет строка внутри вашей функции ошибки, 5 в вашем примере. Измените вашу функцию так, чтобы она принимала тип int для макроса __LINE__.

Я бы использовал макрос, на который ответил @Ed Heal. Кроме того, причина, по которой вы получаете сообщение «msg not unknown», заключается в в том, что переменные в макросах должны быть заключены в круглые скобки (т. Е. (msg)). , поскольку между именем макроса и начинающимися скобками есть пробел. список параметров.

0 голосов
/ 28 октября 2011

Вы можете сделать ERR макросом:

#define ERR(msg) fprintf(stderr, "ERROR on line %d: %s\n", __LINE__, (msg))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...