C 전처리기에 __map과 VA_COUNT 같은 내장 매크로를 추가한 DrC 컴파일러 작성기
- __map()을 내장하면 전처리기 재귀를 흉내 내는 대신 인자마다 한 번씩 선형으로 스캔해서 인자 개수 제한이 사라짐
- __print()와 __where()는 매크로가 어떻게 확장되는지, 어디서 정의됐는지 stderr로 찍어주는 디버깅용 내장 매크로임
- VA_COUNT는 cpp가 이미 아는 가변 인자 개수를 바로 얻는 기능이라 NARG 같은 우회 매크로를 대체함
- 작성자는 C 전처리기가 텍스트 변환기가 아니라 소스를 C 토큰으로 바꾸는 단계별 과정이라고 설명함
Hacker News 의견들
MAP은 전처리기를 굳이 확장 안 해도 swansontec/map-macro 레포로 되는데요.
글에서는 구현 방법을 보여주는 거고, 그래도 내장으로 있어야 한다고 봄.
근데 그 레포도 재귀 한계가 있어서 임베디드에서 레지스터 정의가 수천 개면 안 됨.
CAT 두 단계 방식이랑 NARG 같은 거 비자명한 전처리 하면 결국 다시 만들게 됨. __COUNTER__가 C29에 들어간다니 __VA_COUNT__랑 __CAT__도 기대해볼 만함.
비자명한 전처리는 컴파일 느리고 디버깅 지옥임. C 헤더 호환 필요하면 C++, 아니면 zig 쓰는 게 낫고, 그냥 #include만 쓰는 게 답임. constexpr 나오니까 #define도 구식임.
전처리기를 Snobol 같은 튜링 완전 언어로 확장해서 Terra처럼 메타프로그래밍 하는 시도 누가 해봤음? metalang99나 Cello 같은 꼼수 말고 제대로 된 추가 기능 얘기임.
C++도 원래 전처리기 하나에서 시작했잖음.
C 전처리기는 실질적으로 튜링 완전인데, 엄밀한 의미에서는 아님. 컴퓨터 자체가 실질적으로만 튜링 완전인 거랑 같은 논리임.
#if에서 문자열 비교 되면 진짜 좋겠음. 그것만 있어도 불편한 게 많이 줄어듦.