[Rust] 유용한 기본 매크로 소개
기본 매크로 중에서 쓸만한 것들을 정리해본다.
include_str & include_byte 매크로
앱을 만들다보면, 코드와 별개의 애셋을 코드 내에 내장하고 싶을 수도 있다.
적당한 크기의 텍스트파일이거나, 작은 크기의 이미지라면 그냥 앱 내에 집어넣는 것이 편리하고 효율적인 경우가 제법 많기 때문이다.
그럴 때 유용한 것이 include 매크로다.
예를 들어 이렇게 json 파일이 있고, 그걸 코드 내로 바로 가져오고 싶다면

이렇게, 현재 코드 기준으로 파일 경로를 지정해서 매크로를 사용하면 된다.
컴파일타임에 치환하기 때문에 사용으로 인한 성능 저하는 없다.
dbg 매크로
dbg는 간단한 표현식 값 검사에 유용한 매크로 숏컷이다.
예를 들어보자. 코드를 작성하다보면, 아래와 같이 값을 변수에 바인딩하지 않고 연속적으로 연산을 할 경우가 빈번하다.
이 상태에서 do_something의 반환값을 출력해서 확인해보고 싶다면 어떻게 해야 할까?
보통은 이런 식으로 값을 억지로 할당해서 출력하거나, 디버거 켜서 중단점 걸고 값을 다 싹 보는게 일반적인 대응법일 것이다.
변수를 또 할당하는건 매우 귀찮은 일이다.
그리고 디버거는 느릴때도 있고, 굳이 그것까지 가고 싶지 않을 수도 있다.
dbg 매크로를 사용하면 이러한 불편함을 좀 줄일 수 있다.
사용법은 간단하다. 값을 확인하려는 표현식에 매크로를 씌우면 된다.

그럼 그 값을 알아서 출력해주고, 값 자체는 그대로 반환된다.
matches 매크로
어느 시점부터 단일 패턴 조건문이 있으면 그걸 matches로 바꾸라는 clippy의 협박이 생겼더라.
이건 값과 패턴을 받아서, 일치하는 패턴인지를 true/false로 반환해주는 간단한 숏컷형 매크로다.
일반적인 패턴 표현식이 전부 들어갈 수 있다.
내부 동작 방식도 매우 단순하다. 그냥 match 돌리는게 다다.
compile_error 매크로
이건 진짜 말 그대로 컴파일 오류를 던지는 매크로다.

이 매크로가 호출되면 그 코드는 무조건적으로 컴파일에 실패한다.
일반적인 응용프로그램에서는 쓸일이 없지만, 라이브러리를 설계할 때는 유용하게 사용될 수 있다.
Rust는 매크로 기반의 cfg를 이용한 조건부 코드 포함이 가능하기 때문에, 이걸 기반으로 특정 feature 조합을 거부하거나, 플랫폼에 따라서 명시적인 불가능 표현을 할 수 있다.
env! 매크로
env!는 환경변수를 읽어오는 가장 단순한 방법이다.
이건 컴파일타임에 처리되기 때문에, 상수로도 사용할 수 있다.
근데 개발환경을 벗어나서 실제 로직에 포함하는 데는 한계가 있는데, 환경변수의 주입이 컴파일타임으로 고정되기 때문이다.
그래서 컴파일한 다음에 환경변수를 바꿔봐도 통하지 않는다.
이런 환경변수의 본래 용도에 맞게 적용을 하고 싶다면, 그냥 std::env를 쓰는 것이 맞다.
컴파일타임 치환이라서 컴파일타임 시점에 값이 없으면 컴파일 에러가 난다.
일상적으로 사용할만한 것은 아니지만, 종종 유용할 때가 있다.