티스토리 뷰

Idea

printf 고찰

norux 2014. 3. 1. 14:48


옛날에 언젠가 printf의 원형이 궁금했던적이 있었다.



비주얼스튜디오 6.0인가.. 오래된 비주얼스튜디오 버전을 사용하고 있었을 때, stdio.h 문서파일을 열어서 처음 printf의 원형을 마주하게 되었다.


int printf (const char* Format, ...);


그때 기억으로 printf는 위와 같이 아주 단순했는데.. 2013 버전에 있는 표준입출력 문서로 찾아보니 아래와 같이 나와있다.. 매크로의 향연.


_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);



솔직히 의미는 잘 모르겠지만, 매크로를 잠깐 살펴본 내 생각을 적어보자면


sal.h 라는 헤더파일내에서

_USE_DECLSPECS_FOR_SAL

전처리기를 통해 이 디파인 상수를 사용하지 않을 때(값이 0 일때)는 아무 작업도 수행하지 않게 되어있는 것을 보아 특정한 디버깅을 위해서 만들어진 매크로들이 아닐까.. 라는 생각을 한다. (근거 별로 없는 생각일 뿐..)


만약 위 디파인 상수가 1일 때는 SAL_NAME (name , args, annotes) 의 형태로 만들어 진다.

(사실 뒤에도 뭐 다른 매크로가 하나 더 붙어있고, SAL_NAME도 매크로고, 내부도 다 매크로로 연결 연결되어 결국  매크로_이름(x) #x 이렇게 놓는 형태이다. 이 마저도 너무 매크로가 많아 한 부분만 끝까지 가보자 하고 잡고 들어간거라 다른 쪽 방향은 다른 결과일지도 모른다... 암튼 엄청 복잡하게 되어있다.)




흠..

printf의 원형에 대한 이야기는 이쯤 하고, 원형을 보고 나자 실제 정의부(body)가 보고 싶어졌다.

그래서 한참을 찾았는데 못 찾았었던 기억이 있다.

도저히 찾을 수 없자 운영체제의 한 라이브러리로 묶여있겠거니.. 생각하고 넘어갔었다.


물론 지금도 그 때 했던 생각과 비슷하게 운영체제의 시스템 라이브러리의 한 부분에 포함되어 있을거라고 생각한다.

하지만 생각이 조금 업그레이드 된 것이, printf의 몸체는 표준 c언어가 아니라 어셈블리어로 작성되었을 거라는 것이다. (기계어로 직접 만들었을 수도 있겠지만.... 어셈블리어겠지..?)


어셈블리어로 printf의 수행을 만들고 그 코드를 토대로 만들어진 목적파일이 OS 어딘가에 있지 않을까 라고 ㅎㅎ




여기까지 생각이 미치자 한번 더 찾아보고 싶어졌다.

가장 기본적이면서 한 번도 실체를 보지못한 printf에 대한 호기심이다.


음.. 나중에 시간되면 어셈블리어로 printf의 동작을 수행하는 코드를 만들어봐야겠다 ㅎㅎ





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함