Хотя общий случай нахождения номера строки по конкретной инструкции сложен, т. Е. GDB пытается найти номер строки из некоторого кода, который вылетел, инструкция printf __LINE__
относительно прямолинейна, так как компилятор генерируетчисло как статическое для определенного местоположения.
Сам стандарт C11 просто говорит, что номер строки не должен изменяться, пока вы находитесь в макросе, то есть __LINE__
должен отражать, где вы находитесь в программе послемакрос был расширен, а не строка кода, в которой расположен макрос.Это позволяет вам делать такие вещи, как предоставление номера строки вызываемой функции, создав макрос, который напечатал номер строки и затем вызвал вашу функцию.Например:
#define f(x) ({ printf("called f(x) at line=%d\n", __LINE__); f__real(x); })
Что касается точного представленного номера строки, он зависит от компилятора и не является частью какого-либо стандарта.Т.е. ваш пример может быть переписан как:
int main() {
printf("%d\n",
__LINE__);
}
, и в этом случае допустимый ответ может быть 2 или 3.
Если вы пытаетесь определить номер строки динамически, то естьпредоставляется через системные библиотеки отслеживания.т.е. backtrace () в Linux.