dbg(…)
printf
스타일 디버깅 팬을 위한 매크로입니다.
디버거는 훌륭합니다. 그러나 때때로 모든 것을 올바르게 설정할 시간이나 인내심이 없고 런타임에 일부 값을 검사할 수 있는 빠른 방법을 원할 수도 있습니다.
이 프로젝트는 일반적으로 printf("…", …)
또는 std::cout << …
작성하는 모든 상황에서 사용할 수 있는 dbg(…)
매크로가 포함된 단일 헤더 파일을 제공합니다. 그러나 몇 가지 추가 기능이 제공됩니다.
# include < dbg.h >
# include < cstdint >
# include < vector >
// You can use "dbg(..)" in expressions:
int32_t factorial ( int32_t n) {
if ( dbg (n <= 1 )) {
return dbg ( 1 );
} else {
return dbg (n * factorial (n - 1 ));
}
}
int32_t main () {
std::string message = " hello " ;
dbg (message); // [example.cpp:15 (main)] message = "hello" (std::string)
const int32_t a = 2 ;
const int32_t b = dbg ( 3 * a) + 1 ; // [example.cpp:18 (main)] 3 * a = 6 (int32_t)
std::vector< int32_t > numbers{b, 13 , 42 };
dbg (numbers); // [example.cpp:21 (main)] numbers = {7, 13, 42} (std::vector<int32_t>)
dbg ( " this line is executed " ); // [example.cpp:23 (main)] this line is executed
factorial ( 4 );
return 0 ;
}
위의 코드는 다음과 같은 출력을 생성합니다(직접 시도해 보세요).
std::optional
등을 위한 특수 프린터입니다.dbg.h
헤더는 포함될 때 컴파일러 경고를 발행합니다(따라서 이를 제거하는 것을 잊지 마십시오). 이를 실용적으로 만들려면 dbg.h
헤더를 다양한 장소와 환경에서 쉽게 사용할 수 있어야 합니다. 빠르고 더러운 방법은 실제로 헤더 파일을 /usr/local/include
에 복사하거나 저장소를 복제하고 dbg.h
/usr/local/include/dbg.h
에 심볼릭 링크하는 것입니다.
git clone https://github.com/sharkdp/dbg-macro
sudo ln -s $( readlink -f dbg-macro/dbg.h ) /usr/local/include/dbg.h
파일 시스템에 추적되지 않은 변경 사항을 적용하고 싶지 않은 경우 운영 체제 또는 패키지 관리자용 패키지가 있는지 아래에서 확인하세요.
AUR에서 dbg-macro
설치할 수 있습니다.
yay -S dbg-macro
다음을 통해 dbg-macro
포트를 설치할 수 있습니다.
vcpkg install dbg-macro
CMakeLists.txt
cmake_minimum_required ( VERSION 3.11) # FetchContent added in cmake 3.11
project (app) # name of executable
set (CMAKE_CXX_STANDARD 17)
# dbg-macro
include (FetchContent)
FetchContent_Declare(dbg_macro GIT_REPOSITORY https://github.com/sharkdp/dbg-macro)
FetchContent_MakeAvailable(dbg_macro)
add_executable ( ${PROJECT_NAME} main.cpp) # your source files goes here
target_link_libraries ( ${PROJECT_NAME} PRIVATE dbg_macro) # make dbg.h available
main.cpp
# include < dbg.h >
int main () {
dbg ( 42 , " hello world " , false );
return 0 ;
}
dbg(…)
매크로를 비활성화하려면(즉, 작동하지 않게 하려면) DBG_MACRO_DISABLE
플래그를 설정하십시오.DBG_MACRO_NO_WARNING
플래그를 설정하십시오.DBG_MACRO_FORCE_COLOR
플래그를 설정하십시오. dbg(…)
매크로에 여러 인수를 전달할 수 있습니다. dbg(x, y, z)
의 출력은 dbg(x); dbg(y); dbg(z);
:
dbg ( 42 , " hello world " , false );
"보호되지 않은 쉼표"를 괄호로 묶어야 합니다.
dbg ( " a vector: " , (std::vector< int >{ 2 , 3 , 4 }));
16진수, 8진수 또는 2진수 표현으로 정수 형식을 지정하려면 간단히 dbg::hex(…)
, dbg::oct(…)
또는 dbg::bin(…)
으로 래핑하면 됩니다.
const uint32_t secret = 12648430 ;
dbg (dbg::hex(secret));
dbg(…)
이미 괄호 안의 각 값에 대한 유형을 인쇄합니다(위 스크린샷 참조). 그러나 때로는 단지 유형을 인쇄하고 싶을 수도 있습니다(해당 유형에 대한 값이 없기 때문일 수도 있음). 이 경우 dbg::type<T>()
도우미를 사용하여 주어진 유형 T
예쁘게 인쇄할 수 있습니다. 예를 들어:
template < typename T>
void my_function_template () {
using MyDependentType = typename std::remove_reference<T>::type&&;
dbg (dbg::type<MyDependentType>());
}
타임스탬프를 인쇄하려면 dbg::time()
도우미를 사용할 수 있습니다.
dbg (dbg::time());
dbg(…)
사용자 정의 데이터 유형에 대해 작동하도록 하려면 간단히 std::ostream&
에 대해 operator<<
오버로드하면 됩니다.
std::ostream& operator <<(std::ostream& out, const user_defined_type& v) {
out << " … " ;
return out;
}
dbg(…)
에 의해 인쇄된 유형 이름을 수정하려면 사용자 정의 get_type_name
오버로드를 추가할 수 있습니다.
// Customization point for type information
namespace dbg {
std::string get_type_name (type_tag< bool >) {
return " truth value " ;
}
}
dbg-macro
에 기여하고 싶다면 테스트와 데모를 구축하는 방법은 다음과 같습니다.
하위 모듈이 최신인지 확인하세요.
git submodule update --init
그런 다음 일반적인 cmake
작업 흐름을 사용합니다. -DCMAKE_CXX_STANDARD=17
사용은 선택 사항이지만 가장 많은 기능 세트를 활성화하려면 권장됩니다.
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=17
make
테스트를 실행하려면 다음을 호출하면 됩니다.
make test
tests/basic.cpp
에서 단위 테스트를 찾을 수 있습니다.
이 프로젝트는 Rusts dbg!(…)
매크로에서 영감을 받았습니다.