====== C의 이중자와 삼중자 ====== 기본적으로는, [[ISO C]]에서 일부 [[문자집합]]이 제공하지 않는 글자를 다른 글자의 열로 표현할 수 있도록 하는 기능. 그러나 사실은, C를 꽤 오래 써 왔다는 사람조차도 이 따위 기능의 존재를 몰랐거나, 알더라도 쓸 일이 절대로 없는 **매우 무쓸모한 기능**이다. [[컴파일러]] 옵션에서 아예 꺼 버리는 것이 정신 건강에 이롭다. [[IOCCC]]에서 종종 나오기도 하지만, 솔직히 그런 코드 짤만한 사람은 대부분 이 물건을 알고 있기 때문에 참신함이 떨어진다는 지적을 받을 가능성이 높다. 그보다 글자 수가 두 배 내지 세 배로 늘어나는데 ===== 삼중자 ===== ^ 삼중자 ^ 대응 문자 ^ 삼중자 ^ 대응 문자 ^ 삼중자 ^ 대응 문자 ^ | ''??='' | ''#'' | ''??/'' | ''\'' | ''??' '' | ''^'' | | ''??('' | ''['' | ''??)'' | '']'' | ''??!'' | ''|'' | | ''??<'' | ''{'' | ''??>'' | ''}'' | ''??-'' | ''~'' | ISO C의 삼중자(trigraph)는 1994년 표준((대응되는 [[C99]] 참조는 ISO/IEC 9899:1999 §5.2.1.1.))에 추가되었으며, 다른 [[ISO표준]]인 [[ISO IEC 646]] [[문자집합]]에서 모든 국가에서 지원하지는 않는 문자(ISO/IEC 646 INV)를 다른 방법으로 표현할 수 있게 하려는 목적으로 만들어졌다. 예를 들어 ISO/IEC 646 DE에서는 ''[''와 '']'' 자리에 ''Ä''와 ''Ü''가 대신 들어 있기에, ''a[3]'' 같은 코드를 ''aÄ3Ü'' 처럼 쓰는 불편함이 있는데 이를 ''a??(3??)'' 처럼 쓸 수 있게 하려는 것이었다. ...이걸 액면 그대로 믿는다면 **[[ASCII]]의 8비트 확장이 널리 쓰이던 1994년에 왜 이 기능을 집어 넣고 있는가**를 심각하게 고민해 봐야 할 것이다. 그 의도는 좋았지만, 표준에 들어간 시점이 너무 늦었기 때문에 삼중자는 거의 쓸모가 없는 기능으로 전락하고 만다. 게다가 삼중자 치환은 문자열 리터럴과 [[주석]]을 포함한 모든 코드 안에서 전처리 직전에 이루어지기 때문에 이런 황당한 [[버그]]가 나타날 수도 있다. // 다음 코드는 실행될까요 말까요????????????????/ printf("우왕ㅋ굳ㅋ\n"); 맨 마지막에 (아마 [[오타]]로 발생한) ''??/''가 ''\''로 바뀌면서 다음 문장이 주석의 일부가 되어 버린다. [[안습]]. (물론 한 줄 주석은 [[C99]]에서 새로 추가된 것이다만) ===== 이중자 ===== ^ 이중자 ^ 대응 문자 ^ 이중자 ^ 대응 문자 ^ 이중자 ^ 대응 문자 ^ | ''<:'' | ''['' | '':>'' | '']'' | ''%:'' | ''#'' | | ''<%'' | ''{'' | ''%>'' | ''}'' | | | ISO C의 이중자(digraph)는 삼중자의 폐해를 줄이면서 삼중자를 대체하려는 시도로 추가((대응되는 [[C99]] 참조는 ISO/IEC 9899:1999 §6.4.6 문장 3.))되었으며, 삼중자와는 달리 문자 단위로 치환되는 게 아니라 [[토큰화|토큰]] 단위로 치환된다. 이를테면 ''%:%:''는 ''##''와 똑같이 동작하지만, 그건 ''%:''가 ''#''로 치환되기 때문이 아니라 그냥 (''##''와 같은 역할을 하는) ''%:%:''라는 토큰이 추가되었기 때문이다. 그러니 문자열 안에서는 바뀌지 않는다. ...그렇다고 이중자가 삼중자를 대체해서 쓰이지는 않고, 그냥 삼중자와 함께 묻혔다. 또한 이중자가 다른 [[부수효과]]가 없다고 할 수도 없는게, 이중자 때문에 문법 오류가 나는 경우가 없지는 않다: #include template struct holder { T value; holder(T value): value(value) {} }; T<::std::string> stringholder = "Hello?"; 이 코드의 경우 ''T<::std::string>''은 ''T[:std::string>''으로 처리되어 버린다. {{tag>프로그래밍}}