Пространства имён
Варианты
Действия

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

Материал из cppreference.com
 
 
Язык С++
Общие темы
Управление потоком
Операторы условного выполнения
Операторы итерации (циклы)
Операторы перехода
Функции
Объявление функции
Выражение лямбда-функции
Спецификатор inline
Спецификации динамических исключений(до C++17*)
Спецификатор noexcept(C++11)
Исключения
Пространства имён
Типы
Спецификаторы
decltype(C++11)
auto(C++11)
alignas(C++11)
Спецификаторы длительности хранения
Инициализация
Выражения
Альтернативные представления
Литералы
Логические - Целочисленные - С плавающей запятой
Символьные - Строковые - nullptr(C++11)
Определяемые пользователем(C++11)
Утилиты
Атрибуты(C++11)
Types
Объявление typedef
Объявление псевдонима типа(C++11)
Casts
Неявные преобразования - Явные преобразования
static_cast - dynamic_cast
const_cast - reinterpret_cast
Выделение памяти
Классы
Свойства функции класса
Специальные функции-элементы
Шаблоны
Разное
 
 

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

Содержание

[править]Синтаксис

#lineномер-строки (1)
#lineномер-строки"имя-файла" (2)

[править]Объяснение

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

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

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

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

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

[править]Примечание

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

[править]Пример

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

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

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

[править]Ссылки

  • C++23 стандарт (ISO/IEC 14882:2023):
  • 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 по Информация о имени файла и строке
close