Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 삼중자(Trigraph)란? ISO-646 문자 집합 한계와 삼중 치환 시퀀스 총정리

삼중자(Trigraph)란 무엇인가?

C와 C++ 문법에서 사용되는 일부 특수 문자는 ISO-646 문자 집합에 포함되어 있지 않습니다. 과거에는 일부 시스템의 키보드나 디스플레이가 이러한 문자를 입력하거나 출력하지 못하는 경우가 있었는데, 이를 해결하기 위해 세 글자로 구성된 대체 시퀀스인 삼중자(trigraph)가 고안되었습니다.

컴파일러는 다른 어떤 처리보다도 먼저 소스 코드에서 아래 표와 같은 세 문자 시퀀스("삼중자 시퀀스")를 발견하면, 해당 시퀀스를 하나의 단일 문자로 치환합니다.

삼중자치환 결과삼중자치환 결과삼중자치환 결과
??=#??([??<{
??/\??)]??>}
??'^??!|??-~

삼중자가 생긴 역사적 배경

삼중자는 주로 역사적인 이유로 존재합니다. 오늘날 대부분의 언어를 지원하는 최신 키보드는 위 표의 모든 특수 문자를 손쉽게 입력할 수 있습니다. 하지만 과거에는 일부 유럽 국가의 키보드 레이아웃에서 #, [], {}, ^, |, ~ 같은 문자를 입력하기 어려운 경우가 많았습니다. 바로 이러한 환경에서도 C 코드를 작성할 수 있도록 돕기 위해 삼중자가 발명된 것입니다.

예를 들어, 키보드에서 #를 입력할 수 없는 시스템이라면 전처리 지시문을 ??=include <stdio.h>처럼 작성할 수 있었고, 컴파일러는 이를 자동으로 #include <stdio.h>로 치환하여 처리했습니다.

현대 C++에서의 삼중자: 더 이상 필요 없는 기능

현재 삼중자는 사실상 사용되지 않으며, 오히려 문자열 리터럴에 ??가 포함될 경우 의도치 않은 치환이 일어나 버그를 유발할 수 있는 요소로 꼽힙니다. 이러한 문제 때문에 C++11에서는 삼중자가 폐기(deprecated) 대상으로 분류되었고, C++17부터는 표준에서 완전히 제거되었습니다.

따라서 최신 C++ 코드를 작성할 때는 삼중자를 사용하지 않는 것이 좋으며, 컴파일러 옵션을 통해 삼중자 처리를 비활성화하는 것이 일반적입니다. 다만 레거시 코드나 임베디드 환경의 오래된 소스를 읽을 때는 위 표의 치환 규칙을 알아두면 도움이 됩니다.