2015년 9월 5일 토요일

개인적으로 오래된 C언어(헤더 파일; 전처리기) 문제??

대학교2학년에 (1990년이다) 교재로 사용해서 공부했던 자료구조론 책이 있었다.
원서였고,
ISBN 0-201-16116-8
인 (Van Wyk, Christopher J.) 이 쓴, Data structures and C programs
라는 책이었다. 이 책의 맨 뒷부분의 부록C (Appendix C)에는 이 책에서
쓰인 예제 소스코드(source code)에 사용된 (header file)이 나온다.
그런데, 여기에는 여기 자체에서도 언급되었던 문제가 있었다. 내용은 딱 1쪽이므로, 간단하니까 일단 그대로 적어보자.

/C/ Our Header File
--
Here is a listing of the file ourhdr.h
#include <stdio.h>
extern char *malloc( );
extern char *strchr( ), *strdup( ); 
#define demand(fact, remark)  {\
if(!(fact)) {\
fprintf(stderr, "demand not met:   fact\n"};\
fprintf(stderr, "remark\n"};\
abort( );\
exit(1);\
}\
typedef int boolean;
#define FALSE 0
#define TRUE     !FALSE
--
If your C compiler will not replace macro arguments that lie inside strings, rewrite demand() to accept remark as a string argument.
--
번역하면,
(첫줄) 여기에 ourhdr.h 파일의 내용 목록이 있다.
(본문은 소스코드이므로 한국어 번역 안한다.)
(마지막) //만약 당신의 C 컴파일러가 문자열 내부에 위치한 (매크로 인자)(macro argument)를 치환하지 않는다면, demand( )를 (문자열 인자)(string argument)를 받아 들이도록 다시 만드시오.
(끝)

그렇다. 이 책이 쓰여진 때는 1988년(책 맨 앞의 출판 정보에 나온 것)이고, 이때만 해도,
ANSI C 라고 불리던 C89 표준이 나오기 전이라서, 여기에 나온 demand( ) 매크로는 우리가 공부할 때에 사용한 그 때의 최신 컴파일러에서...
 "문자열 내부에 위치한 (매크로 인자)를 치환하지 않는"
작동을 했고, C 언어에 아주 짧은 지식만 가지고 있던 나는 아직도 이 문제를 해결하지 못하고 있다.

그 당시 나는 원하던 전공 공부를 거의 완패인 수준으로 실패하고 있었고, 대학교에 들어가기 전에 BASIC, FORTRAN, PASCAL, Apple 2 컴퓨터의 기계어 등을 미리 열심히 공부해 알고 있었지만, C 언어는 그저 기존의 언어와 비슷하구나 라고만 수박 겉핡기로 구경만하고 깊이 알지 못했던 나로서는 도저히 풀 수 없는 문제였다.
그 당시에 이 과목을 같이 듣자고 했던 친구가 이 문제를 물어봤을 때에 나는 그저 고개를 갸웃거리며, 아무 말도 못했었다.
그리고, 그로부터 10년 후에 직업으로 프로그램을 짜기 시작한 지가 15년이 넘고 있지만, 이런 상황은 일을 하면서도 부딪히기가 드문 상황이어서 아직도 고개를 갸웃거리고 있다. (25년 넘게...)
그런데, 며칠 전에 다른 문제로 구글에 질문을 하다가, GCC의 전처리기에 # 연산자와 ## 연산자가 여기에서의 상황에 쓰일 수 있다는 것을 알게 되었다.

https://gcc.gnu.org/onlinedocs/gcc-4.3.2/cpp/Stringification.html#Stringification

원래 답변은 구글 검색
_(구글:  # and ## in c macros )_ 했다.

http://stackoverflow.com/a/217181

그렇다면,... 이 25년 넘은 문제의 해답은???
일이 바빠서 하지 못하고 있다... OTL
이 일요일날 새벽에 밤 새워 일하다가 답답해서 여기에 적어본다.
-


댓글 없음:

댓글 쓰기