Namespaces
Variants

Filename and line information

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

Содержание

Синтаксис

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

Объяснение

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

2) Также изменяет текущее имя файла препроцессора на filename . Раскрытия макроса __FILE__ с этого момента будут выдавать filename .

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

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

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

Примечания

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

Пример

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

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

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

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 15.7 Управление строками [cpp.line]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 15.7 Управление строками [cpp.line]
  • Стандарт C++17 (ISO/IEC 14882:2017):
  • 19.4 Управление строками [cpp.line]
  • Стандарт C++14 (ISO/IEC 14882:2014):
  • 16.4 Управление строками [cpp.line]
  • Стандарт C++11 (ISO/IEC 14882:2011):
  • 16.4 Управление строками [cpp.line]
  • Стандарт C++98 (ISO/IEC 14882:1998):
  • 16.4 Управление строками [cpp.line]

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

класс, представляющий информацию об исходном коде, такую как имена файлов, номера строк и имена функций
(класс)
Документация C для Информация о имени файла и номере строки