질문의 역사:
매크로는 C 언어에서 코드의 반복되는 부분을 프리프로세서 단계에서 자동화하는 강력한 방법으로 등장했습니다. C++에서의 사용은 유연성을 제공했지만, 타입 검사의 부재와 프리프로세서의 비가시성으로 인해 많은 숨겨진 위험을 초래했습니다.
문제:
매크로 사용의 주요 위험:
해결책:
현대 C++ 표준에서는 매크로 대신 인라인 함수, 템플릿, constexpr, enum class 및 constexpr 변수를 사용하는 것이 권장됩니다.
코드 예시:
// 나쁨: #define MAX(a, b) ((a) > (b) ? (a) : (b)) // 좋음: template<typename T> constexpr T max(T a, T b) { return a > b ? a : b; }
주요 특징:
매크로가 인라인 함수보다 더 위험할 수 있습니까?
네. 매크로는 문법 및 타입 규칙을 따르지 않습니다. 부작용이 있는 인자를 전달하면 예상치 못한 결과가 발생할 수 있습니다.
#define SQUARE(x) ((x) * (x')) int y = 5; int z = SQUARE(y++); // y가 두 번 증가합니다!
#include도 매크로입니까?
아닙니다. #include는 프리프로세서 지시문이지만, 매크로와 include의 사용은 관련이 있습니다: 매크로를 통해 포함할 파일 목록을 변경할 수 있습니다 (매우 권장하지 않음).
매크로를 일반 함수처럼 디버깅할 수 있습니까?
아닙니다. 디버거는 매크로를 풀고 대체된 텍스트를 표시하며, 별도의 명명된 실체가 없습니다.
구 코드는 효과가 있는 수많은 계산 매크로가 정의되어 있었고 (예: 증가), 이는 새로운 기능의 사용 시 잡히기 힘든 버그를 초래했습니다.
장점:
단점:
리팩토링 시 매크로는 템플릿 및 constexpr 함수로 대체되었고, enum class는 플래그 매크로 대신 사용되었습니다.
장점:
단점: