Namespaces
Variants

Filename and line information

From cppreference.net

Изменяет текущий номер строки и имя файла в препроцессоре.

Содержание

Синтаксис

#line lineno (1)
#line lineno " filename " (2)
**Примечание:** В данном случае переводить нечего, так как: - HTML теги и атрибуты не переводятся - Текст внутри тегов ` ` и ` ` не переводится (C++ директива `#line`) - Параметры `lineno` и `filename` являются техническими терминами - Номера вариантов (1) и (2) остаются без изменений Сохранена оригинальная структура и форматирование таблицы.

Объяснение

1) Изменяет текущий номер строки препроцессора на lineno . Вхождения макроса __LINE__ после этой точки будут раскрываться в lineno плюс количество фактических строк исходного кода, встреченных с этого момента.
2) Также изменяет текущее имя файла препроцессора на filename . Вхождения макроса __FILE__ после этой точки будут выдавать filename .

Любые препроцессорные токены (макроконстанты или выражения) допустимы в качестве аргументов для #line при условии, что они раскрываются в корректное десятичное целое число, за которым может следовать допустимая символьная строка.

lineno должен быть последовательностью как минимум одной десятичной цифры (в противном случае программа некорректна) и всегда интерпретируется как десятичное число (даже если оно начинается с 0 ).

Если lineno равен 0 или больше чем 32767 (до C99) 2147483647 (начиная с C99) , поведение не определено.

Примечания

Эта директива используется некоторыми автоматическими инструментами генерации кода, которые создают C-файлы из файлов, написанных на другом языке. В этом случае, #line директивы могут быть вставлены в сгенерированный C-файл со ссылками на номера строк и имя исходного (редактируемого человеком) файла.

Номер строки, следующий за директивой #line __LINE__ не определён (существует два возможных значения, в которые __LINE__ может раскрыться в данном случае: количество переносов строк, встреченных до этого момента, или количество переносов строк, встреченных до этого момента, плюс перенос строки, завершающий директиву #line ). Это является результатом DR 464 , который применяется ретроактивно.

Пример

#include <assert.h>
#define FNAME "test.c"
int main(void)
{
#line 777 FNAME
        assert(2+2 == 5);
}

Возможный вывод:

test: test.c:777: int main(): Assertion `2+2 == 5' failed.

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.10.4 Управление строками (стр. 126)
  • J.1 Неопределенное поведение
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.10.4 Управление строками (стр. 173)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.10.4 Управление строками (стр: 158)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.8.4 Управление строками

Смотрите также

Документация C++ для Информация о имени файла и строке