여기에서 C의 Hygienic Macros를 볼 수 있습니다. 우리는 C의 매크로 사용법을 알고 있습니다. 그러나 때로는 실수로 식별자를 캡처하여 원하는 결과를 반환하지 않는 경우가 있습니다.
다음 코드를 보면 제대로 동작하지 않는 것을 알 수 있습니다.
예시
#include<stdio.h> #define INCREMENT(i) do { int a = 0; ++i; } while(0) main(void) { int a = 10, b = 20; //Call the macros two times for a and b INCREMENT(a); INCREMENT(b); printf("a = %d, b = %d\n", a, b); }
전처리 후 코드는 다음과 같습니다 -
예시
#include<stdio.h> #define INCREMENT(i) do { int a = 0; ++i; } while(0) main(void) { int a = 10, b = 20; //Call the macros two times for a and b do { int a = 0; ++a; } while(0) ; do { int a = 0; ++b; } while(0) ; printf("a = %d, b = %d\n", a, b); }
출력
a = 10, b = 21
여기에서 값이 업데이트되지 않은 것을 볼 수 있습니다. 따라서 이 경우 위생적인 매크로를 사용합니다. 이러한 위생적 매크로는 확장을 통해 실수로 식별자를 캡처하지 않도록 보장하는 매크로입니다. 여기서는 확장 중인 코드와 인터페이스할 위험이 있는 변수 이름을 사용하지 않습니다. 여기서 또 다른 변수 't'가 매크로 내에서 사용됩니다. 프로그램 자체에서는 사용되지 않습니다.
예시
#include<stdio.h> #define INCREMENT(i) do { int t = 0; ++i; } while(0) main(void) { int a = 10, b = 20; //Call the macros two times for a and b INCREMENT(a); INCREMENT(b); printf("a = %d, b = %d\n", a, b); }
출력
a = 11, b = 21