본문 바로가기
C++

[C++ 20] std::source_location 사용하기

by 코드쉼터 2024. 4. 22.

[C++ 20] std::source_location 를 사용하면 현재 코드 실행 정보를 개체로 만들어 다양하게 활용할 수 있습니다.

사용을 위해선 #include <source_location> 헤더를 추가해야 합니다.

 

기존 [C 언어] 의 __LINE__, __FILE__, __DATE__, __FUNCTION__ (C99 : __func__) 와 같이 미리 정의된 표준 매크로 의 문제점을 개선하기 위해 만들어졌습니다.

예를 들어, __FUNCTION__ 을 사용하면 함수 이름만 얻을 수 있고 함수의 반환 타입과 입력 파라미터 정보를 얻을 수 없는 문제가 있었는데 std::source_location 를 사용하면 모든 정보를 얻을 수 있습니다. (__FUNCSIG__ 같은 매크로를 사용할 수 있지만 표준이 아닙니다)

 

 

사용 예시

#include <iostream>
#include <source_location>
#include <string_view>
 
void log(const std::string_view message,
         const std::source_location location =
               std::source_location::current()) // line 7(*)
{
    std::clog << "file: "
              << location.file_name() << '('
              << location.line() << ':'
              << location.column() << ") `"
              << location.function_name() << "`: "
              << message << '\n';
}
 
template<typename T>
void fun(T x)
{
    log(x); // line 20
}
 
int main(int, char*[])
{
    log("Hello world!"); // line 25
    fun("Hello C++20!");
}

// 출력 결과
file: main.cpp(25:8) `int main(int, char**)`: Hello world!
file: main.cpp(20:8) `void fun(T) [with T = const char*]`: Hello C++20!

위는 std::source_location 를 다루기 쉽도록 log() 라는 헬퍼 함수 (wrapper function) 를 미리 정의해두고 활용하는 예제입니다. std::source_location::current() 가 호출되는 순간의 파일정보, 코드의 실행 줄, 함수 정보 등을 location 이라는 변수에 담아두고 이를 출력하고 있습니다.

*언뜻 보면 std::source_location::current() 가 불리는 시점이 7번째 줄로 로그가 항상 동일하게 나와야 할 것 같지만, 7번째 줄에 있는 const std::source_location location = std::source_location::current() 는 실제 대입이 아닌 디폴트 값의 의미이며, 실제 디폴트 값이 활용되는 순간은 20번째 줄, 25번째 줄에서 함수를 호출하는 순간이므로 이렇게 헬퍼 함수를 만들어 사용 가능합니다.

 

 

참고자료

https://en.cppreference.com/w/cpp/utility/source_location