C 프로그래밍에서 main() 함수가 실행되기 전과 후에 특정 함수를 자동으로 호출해야 하는 경우가 있습니다. 예를 들어 프로그램 시작 전에 초기화 작업을 수행하거나, 종료 후에 리소스 정리(clean-up) 작업을 처리할 때 유용합니다.
이를 구현하려면 GCC에서 제공하는 __attribute__ 기능을 활용하면 됩니다. 두 가지 속성이 사용됩니다.
- constructor:
main()함수가 실행되기 이전에 해당 함수가 호출됩니다. - destructor:
main()함수가 종료된 이후에 해당 함수가 호출됩니다.
예제 코드
#include<stdio.h>
void before_main() __attribute__((constructor));
void after_main() __attribute__((destructor));
void before_main() {
printf("This is executed before main.\n");
}
void after_main() {
printf("This is executed after main.");
}
main() {
printf("Inside main\n");
}실행 결과
This is executed before main. Inside main This is executed after main.
동작 원리 설명
위 코드에서 before_main() 함수에는 constructor 속성이 지정되어 있으므로, 프로그램이 시작되면서 main()보다 먼저 실행됩니다. 반면 after_main() 함수에는 destructor 속성이 지정되어 있어 main()의 실행이 모두 끝난 뒤에 호출됩니다.
따라서 출력 결과를 보면 "Inside main" 메시지 앞뒤로 각각 초기화 함수와 정리 함수가 실행된 순서를 확인할 수 있습니다. 이러한 기법은 로깅 초기화, 전역 리소스 할당 및 해제 등 다양한 상황에서 활용될 수 있습니다.