C언어 컴파일러 만드는 사람 마음이긴 하지만 전처리기로 제외시킨 코드를 굳이 바이너리로 변환할 이유도 없고 최적화하기 위해서는 당연히 그래야 합니다. 제가 아는 C언어 컴파일러 중에 전처리기로 제외시킨 코드를 바이너리로 기본적으로 변환하는 컴파일러는 없습니다.
당연한 문제인데 직접 해보라는 분이 계셔서 제가 직접 해봤습니다. 컴파일러는 GCC입니다.
위에서부터 test1.c, test2.c, test3.c입니다.
보시다시피, test2.c는 test1.c의 일부를 전처리기(#if 0)로 제외한 소스이고, test3.c는 같은 부분을 삭제한 소스입니다.
각각의 바이너리를 디어셈블링한 정보입니다.
test1.c
test2.c
test3.c
보시다시피, test2.c는 test1.c에서 상당부분이 없어진 것을 볼 수 있고, test2.c와 test3.c는 완전히 동일하다는 것을 알 수 있습니다. 즉, 전처리기로 제외시킨 부분은 컴파일러가 바이너리로 변환하지 않았습니다.