문제의 역사
매크로 매개변수는 C의 전처리기의 중요한 부분으로, 반복되는 코드 조각을 빠르게 삽입하고 디버깅을 단순화하기 위해 등장했습니다. 이들은 작은 함수, 인라인 사용 또는 최적화에 사용됩니다.
문제
매크로는 타입을 검사하지 않고 단순한 텍스트 치환 외에 실제 치환을 수행하지 않습니다. 오류는 괄호의 부재 및 부작용이 있는 표현식의 치환으로 인해 발생합니다.
해결책
매크로의 매개변수와 정의 주위에 괄호를 두고, 인수에서 부작용을 피하며, 보다 복잡한 경우에는 인라인 함수를 사용하는 것이 좋습니다.
코드 예시:
#define MAX(a, b) ((a) > (b) ? (a) : (b)) int x = 5, y = 10; int z = MAX(x++, y++); // 위험한 호출!
주요 특징:
매크로가 항상 함수처럼 코드를 완전히 대체하나요?
아니요! 매크로는 컴파일 전에 단순히 텍스트 치환일 뿐이며, 인수가 부작용이 있는 표현식일 경우 함수와 다르게 동작할 수 있습니다.
매크로의 매개변수로 어떤 호출(예: ++, -- 포함)도 사용할 수 있나요?
매우 위험합니다. 매개변수가 매크로에서 한 번 이상 등장하면 부작용이 여러 번 발생합니다.
코드 예시:
// 이 호출은 x 또는 y를 1 이상 증가시킵니다 MAX(x++, y++)
매크로 정의에서 괄호를 어떻게 올바르게 포함하나요?
호출 시 다른 표현식에서의 결합 오류를 피하기 위해 매개변수와 매크로 내부의 표현식을 모두 괄호로 감싸야 합니다.
회사는 오랫동안 매크로 #define SQUARE(x) xx를 정의했고, 이를 SQUARE(a+1)과 같은 표현식에 사용했습니다. 예상치 못한 오류가 발생했습니다: 표현식이 a+1a+1로 전개되었고, 이는 (a+1)*(a+1)와 다릅니다.
장점:
매크로 SQUARE는 완전한 괄호로 작성되었습니다: #define SQUARE(x) ((x)*(x)). 그의 사용은 표준화되고 문서화되었습니다.
장점: