티스토리 뷰
옛날에 언젠가 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
- 안시 컬러
- C언어
- 폰트 조정
- Angular
- git 설정
- vim
- Swift
- 안시 색상
- terminal 색
- JavaScript
- Rx.js
- qemu linux arm
- 우분투 16.04
- lua table
- Zone.js
- ECMA2015
- itoa
- typeScript
- observable
- ansi color
- 리눅스 터미널 색상
- 타입스크립트
- QT
- git proxy
- ZONES
- 챗봇
- angular2
- 스위프트
- zone
- NgZone
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |