◐ Shell
clean mode source ↗

std::source_location — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

struct source_location;

(начиная с C++20)

Класс std::source_location представляет определённую информацию об исходном коде, такую как имена файлов, номера строк и имена функций. Ранее функции, которые хотели получить эту информацию о месте вызова (для логгирования, тестирования или отладки), должны были использовать макросы, чтобы предопределённые макросы, такие как __LINE__ и __FILE__, раскрывались в контексте вызова. Класс std::source_location представляет собой лучшую альтернативу.

std::source_location соответствует требованиям DefaultConstructible, CopyConstructible, CopyAssignable и Destructible. Lvalue структуры std::source_location соответствует требованию Swappable.

Кроме того, следующие условия равны true:

  • std::is_nothrow_move_constructible_v<std::source_location>,
  • std::is_nothrow_move_assignable_v<std::source_location> и
  • std::is_nothrow_swappable_v<std::source_location>.

Предполагается, что std::source_location имеет небольшой размер и может быть эффективно скопирована.

Не указано, являются ли конструкторы копирования/перемещения и операторы присваивания копированием/перемещением структуры std::source_location тривиальными и/или constexpr.

Функции-элементы

Создание
создаёт новый source_location со значениями, определёнными реализацией
(public функция-элемент) [править]

[static]

создаёт новый source_location, соответствующий местоположению места вызова
(public static функция-элемент) [править]
Доступ к полям
возвращает номер строки, представленный этим объектом
(public функция-элемент) [править]
возвращает номер столбца, представленный этим объектом
(public функция-элемент) [править]
возвращает имя файла, представленное этим объектом
(public функция-элемент) [править]
возвращает имя функции, представленное этим объектом, если таковая имеется
(public функция-элемент) [править]

Примечание

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_source_location

Пример

#include <iostream>
#include <source_location>
#include <string_view>

void log(const std::string_view message,
         const std::source_location location = 
               std::source_location::current())
{
    std::cout << "файл: "
              << location.file_name() << "("
              << location.line() << ":"
              << location.column() << ") `"
              << location.function_name() << "`: "
              << message << '\n';
}

template <typename T> void fun(T x)
{
    log(x);
}

int main(int, char*[])
{
    log("Привет мир!");
    fun("Привет C++20!");
}

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

файл: main.cpp(23:8) `int main(int, char**)`: Привет мир!
файл: main.cpp(18:8) `void fun(T) [with T = const char*]`: Привет C++20!

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

изменяет номер строки исходного кода и, необязательно, текущее имя файла
(директива предварительной обработки) [править]
представление вычисления в трассировке стека
(класс) [править]