이번 글에서는 main() 함수에서 printf() 함수의 출력 결과를 변경하는 방법을 알아보겠습니다. 핵심 아이디어는 특정 함수를 정의하여, 그 함수가 호출된 이후부터 모든 printf() 문이 지정된 값으로 출력되도록 만드는 것입니다.
#define 매크로를 활용한 구현 원리
이 작업에는 전처리기 지시문인 #define 매크로를 사용합니다. 매크로를 함수 내부에 정의하면, 해당 함수가 호출될 때 비로소 매크로가 적용되기 때문에 main 함수에서 호출 시점을 제어할 수 있습니다.
만약 #define 줄을 함수 밖에 그대로 작성하면 프로그램 전체에서 항상 printf()가 변경되어 버립니다. 따라서 main 함수에서 이 동작을 제어하려면 반드시 해당 함수를 먼저 호출해야 합니다.
예제 코드
#include <stdio.h>
void changePrintf() { // 이후의 모든 printf는 항상 50을 출력함
#define printf(x, y) printf(x, 50);
}
main() {
int x = 40;
changePrintf();
printf("%d\n", x);
x = 60;
printf("%d", x);
}실행 결과
50 50
코드 설명
위 예제에서 변수 x의 값은 처음에 40으로, 이후 60으로 각각 설정되었지만 실제 출력은 두 번 모두 50입니다. 그 이유는 changePrintf() 함수가 호출되면서 printf(x, y) 매크로가 정의되어, 두 번째 인자 y에 어떤 값이 전달되더라도 항상 고정된 값인 50으로 대체되기 때문입니다.
즉, printf("%d", x) 형태의 호출은 컴파일 전 단계에서 printf("%d", 50)으로 치환되므로, 변수 x의 실제 값과 무관하게 항상 50이 화면에 출력되는 것입니다.