반응형

C에서 ??에서 시작하는 3문자를 사용하여 정해진 다른 기호로 대체할 수 있다.

문자 대체

별로 알려져 있지 않지만, C 언어에는 문자 상수에 3문자 표기(트라이그래프:trigraph)를 사용할 수 있다. 이것은 ISO 646라는 규격과 관련이 있는데, 왜 이런(까다로운) 표기가 존재 하는가 하면, 거기에는 문자 코드의 역사적인 배경이 있다. ISO 646는 ASCII 코드의 일부 문자를 변경할 수 있도록 고려되어 있다. 이렇게 하면, 영어 이외의 언어에 필요한 특수 기호를 국가별 규격에서 사용할 수 있도록 되어 있지만, 같은 코드에서도 다른 문자가 표시되는 문제가 발생했다.

이 ISO 646의 영향으로 일부 언어(키보드)에서 처리할 수 없는 ASCII 코드를 표현하기 위해 사용된 것이 3문자 표기이다. 3문자 표기는?? 두 문자와 그 뒤의 기호로 표현된다. 현대에는 거의 사용하지 않지만, 모른다면, 리터럴 문자열에 ??라는 단어가 포함된 경우에 예상치 못한 문자로 변환되어 버릴 수 있다.

3문자 표기는 표1과 같은 세 문자로 이루어진 문자 상수이다. 이 3문자는 컴파일시에 대응하는 단일 문자로 대체된다.

표1 - 3문자 표기

트라이그래프대체 문자
??=#
??([
??/\
??)]
??'^
??<{
??!|
??>}
??-~

이러한 변환은 컴파일시 먼저 이루어진다. 더 자세히 설명하면, 컴파일러는 컴파일시에 번역 단계(phase)라는 단위로 소스 프로그램을 정해진 순서에 따라 분석하지만, 3문자 표기는 행이나 토큰이 식별되는 무엇보다 먼저 분석된다.

코드1

??=include <stdio.h>

int main() ??<
    printf("??= , ??( , ??)??/n");
    return 0;
??>

이러한 C 언어 소스 프로그램은 잘못되지 않았다. 3문자 표기는 무엇보다도 앞서 변환되므로 컴파일러 토큰을 분석할 무렵에는 올바른 기호로 변환된다.

문자열 리터럴에 ??을 표현하려면 이스케이프 시퀀스를 사용하여 ? ?를 기술한다.

3문자 표기는 이용 빈도가 낮기 때문에 컴파일 속도 향상을 위해 3문자 표기를 구현하지 않거나 기본적으로는 처리를 하지 컴파일러가 주류이다. 예를 들면 Borland C ++ Compiler 5.5에서는 구현되지 않고, 그 대신 변환 도구 TRIGRAPH.EXE이 제공하고 있다.

>trigraph 소스파일명

이 도구를 사용하면 소스의 3문자 표기를 해당하는 문자로 변환해 준다. Borland C ++ Compiler 5.5에서 3문자 표기를 포함한 소스를 컴파일하려면 먼저 이 도구를 사용하여 올바른 기호로 변환해야 한다.

Microsoft Visual C ++에서는 기본 설정은 비활성화되어 있기 때문에 컴파일러 옵션 /Zc:trigraphs을 지정하여 사용할 수 있다. 단, 편집기에서 3문자 표기를 사용한 코드 입력은 지원하지 않는다.

반응형

+ Recent posts