Это правильное поведение __LINE__ - PullRequest
0 голосов
/ 06 мая 2011
15 ERROR_MACRO("Error is in %s on line %d\n",
16                __FILE__, __LINE__);

Я получаю следующий вывод:

Ошибка в tmp.c в строке 16

Я получаю тот же вывод, даже если я использую приведенную выше строку в этой форме:

15 ERROR_MACRO("Error is in %s on line %d\n", \
16                __FILE__, __LINE__);

Разве я не должен получить "строку 15" вместо "строки 16"?

Что я должен сделать, чтобы получить "строку 15"?

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

__LINE__ всегда расширяется до точного номера строки, на которой он появляется.От компилятора зависит, как он сообщает об ошибках для кода, который занимает несколько строк, но большинство компиляторов идут по той строке, с которой начинается оператор (так как большинство ошибок не могут быть локализованы на один символ).

Нетмакрос, который может определить, на какой строке появляется текущий оператор, так как предварительная обработка обычно происходит еще до того, как компилятор начинает думать об операторах.

0 голосов
/ 06 мая 2011

Если вы настаиваете на использовании __LINE__ в строке, следующей за вызовом, просто выполните:

    ERROR_MACRO("Err in %s on line %d\n",
                __FILE__, __LINE__ - 1);

Еще лучше, почему бы вам просто не определить макрос для вашего макроса:

    #define MY_ERR ERROR_MACRO("Err in %s on line %d", __FILE__, __LINE__)

Теперь вы можете просто позвонить по короткому номеру MY_ERR; вместо того, чтобы беспокоиться об ограничениях на длину линии (поэтому, я полагаю, вы делаете это).

0 голосов
/ 06 мая 2011

переместить ERROR_MACRO в строку 15 в вашем коде? __LINE__ - номер строки в текущем файле. Нет (легального) способа изменить его, если вы не переместите свой код ...

...