Spec-Zone.ru › C

Информация о файле и строке

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

Синтаксис

#line lineno (1)
#line lineno "filename" (2)

Объяснение

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

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

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

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

Примечания

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

Номер строки, следующей за директивой #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++ по Информация о файле и строке

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/preprocessor/line

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API