문제

C ++ '03 표준 2.3/1에 따르면 :

다른 처리가 발생하기 전에, 다음 세 문자 ( "Trigraph Sequences")의 다음 시퀀스 중 하나가 표 1에 표시된 단일 문자로 대체됩니다.

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------

실제 생활에서 그것은 코드를 의미합니다 printf( "What??!\n" ); 인쇄가 발생합니다 What| 왜냐하면 ??! THE로 대체되는 트리 그라프 시퀀스입니다 | 캐릭터.

내 질문은 트리 그라프를 사용하는 목적이 무엇입니까? Trigraph를 사용한다는 실질적인 이점이 있습니까?

upd: 일부 유럽 키보드가 모든 구두점 문자를 가지고 있지 않다고 답한 답변에 언급되어 있으므로, 비 중업 프로그램은 일상 생활에서 트리 그라그를 사용해야합니까?

Upd2: Visual Studio 2010에는 기본적으로 Trigraph 지원이 꺼져 있습니다.

도움이 되었습니까?

해결책

이 질문 (밀접하게 관련된 digraphs) 답이 있습니다.

ISO 646 문자 세트에 C 구문의 모든 문자가 없다는 사실로 요약됩니다. 따라서 캐릭터를 처리 할 수없는 키보드와 디스플레이가있는 일부 시스템이 있습니다 (이들은 매우 드물다고 생각합니다. 요즘에는).

일반적으로 사용할 필요는 없지만 정확히 문제에 대해 알아야합니다. 트리 그라프는 이유입니다.?'캐릭터에는 탈출 순서가 있습니다.

'\?'

따라서 예제 문제를 피할 수있는 몇 가지 방법은 다음과 같습니다.

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

하지만 두 사람을 입력 할 때 기억해야합니까? 당신이 trigraph를 시작할 수있는 캐릭터 (그리고 내가 생각하는 것은 결코 아닙니다).

실제로, Trigraphs와 Digraphs는 매일 걱정하지 않는 것입니다. 그러나 몇 년마다 한 번씩 그들과 관련된 버그가 들어가기 때문에 (그리고 나머지 하루는 그들의 존재를 저주하는 데 보낼 것입니다). 컴파일러가 Trigraph 또는 Digraph를 가로 질러 경고 (또는 오류)로 구성 될 수 있으므로 고의적으로 다루어야 할 것을 알 수 있습니다.

그리고 완전성을 위해서는 Digraphs가 토큰으로 처리되기 때문에 훨씬 덜 위험하므로 문자열 문자 내부의 digraph는 digraph로 해석되지 않습니다.

C/C ++ 프로그램의 구두점으로 다양한 재미에 대한 멋진 교육을 받으려면 (머리카락을 꺼내는 트리 그라프 버그 포함)보십시오. Herb Sutter 's Gotw #86 기사.


부록:

GCC가 기본적으로 트리 그라프를 처리하지 않고 경고하지 않는 것처럼 보입니다. 일부 다른 컴파일러에는 Trigraph Support (예 : IBM)를 끄는 옵션이 있습니다. Microsoft는 VS2008에서 명시 적으로 활성화되어야하는 경고 (C4837)를 지원하기 시작했습니다 (-wall 또는 무언가 사용).

다른 팁

에서 The C++ Programming Language 스페셜 에디션, 829 페이지

ASCII 특수 문자 [, ], {, }, |, 그리고 \ ISO에 의해 알파벳으로 지정된 문자 세트 위치를 점유합니다. 대부분의 유럽 국가 ISO-646 캐릭터 세트 에서이 위치는 영어 알파벳에서는 찾을 수없는 문자로 점유됩니다.

진정한 표준 최소 문자 세트를 사용하여 국가 문자를 휴대용 방식으로 표현할 수 있도록 트라이 그라프 세트가 제공됩니다. 이것은 프로그램의 교환에 유용 할 수 있지만 사람들이 프로그램을 더 쉽게 읽을 수는 없습니다. 당연히이 문제에 대한 장기 솔루션은 C ++ 프로그래머가 모국어와 C ++ 우물을 모두 지원하는 장비를 얻는 것입니다. 불행히도, 이것은 일부 사람들에게는 불가능한 것으로 보이며, 새로운 장비의 도입은 실망스럽게 느리게 진행될 수 있습니다.

오늘 아이들! :-)

예, IBM 3270 터미널과 같은 외국 장비. 3270은 내가 기억한다면, 곱슬 괄호가 없습니다! IBM 미니 / 메인 프레임에 C를 쓰고 싶다면 해야 했어 모든 블록 경계에 비참한 트리 그라 그래프를 사용하십시오. 다행히도 나는 C에서 소프트웨어 만 써야했다. 에뮬레이션 일부 IBM 미니 컴퓨터 시설, 실제로 C 소프트웨어를 작성하지 않습니다. ~에 시스템/36.

"P"키 옆을보십시오.

keyboard

흠. 말하기 어렵습니다. "Carriage Return"옆에 여분의 버튼이 있으며, 뒤로 가질 수 있습니다. 어쨌든,이 키보드는 C를 써야한다면 슬픔을 일으킬 것입니다.

또한이 터미널에는 ASCII가 아닌 IBM의 "기본"메인 프레임 문자 세트 인 EBCDIC (알림에 감사드립니다).

반면에 GNU C 가이드처럼 "이 뇌 손상이 필요하지 않습니다." GCC 컴파일러는이 "기능"을 기본적으로 비활성화합니다.

C ++의 기본 문자 세트의 일부 문자가 부족한 시스템에 사용됩니다. 말할 것도없이, 그러한 시스템은 매우 드물다.

C ++ 0x에서 제거하기 위해 트리 그라프가 제안되었습니다. 즉, 여전히 그들을 뒷받침하는 강력한 논쟁이있는 것 같습니다. C ++위원회 논문 참조 N2910 이것에 대해 논의합니다. 분명히, EBCDIC는 필요한 주요 요새 중 하나입니다.

90 년대 초반에 사용되는 Trigraph가 메인 프레임에서 PL/1 프로그램을 전환하여 PC에서 실행/컴파일/디버깅 할 수 있도록 보았습니다.

그들은 PL/I to C 컴파일러를 사용하여 PC에서 PL/I를 편집하여 덤벼 들었고 곱슬 브레이스를 지원하지 않는 메인 프레임으로 다시 이동했을 때 코드가 작동하기를 원했습니다. 나는 그들이 매크로를 사용할 수 있다고 제안했다

#def BEGIN {    
#def END }  

또는 더 친근한 pl/i 대안으로

#def BEGIN ??<
#def END ??>

그리고 그들이 정말로 공상을 원한다면 그들은 시도 할 수 있습니다

#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

그리고 프로그램은 Pascal에서 작성된 것처럼 보일 것입니다. 그들은 단지 나를 재미있게 보았고 하루 종일 나에게 말하지 않을 것입니다. 나는 내가 그들을 비난하지 않는다고 생각한다. :)

Tri-Graphs가 아닌 노력을 죽인 것은 플랫폼 간의 IO 시스템 차이였습니다. PC에서 파일을 여는 것은 메인 프레임과는 매우 다르며 동일한 코드를 모두 실행하기에는 너무 많은 kludges를 도입했을 것입니다.

일부 유럽 키보드에는 (그렇지 않은가?)에는 우리 키보드가 가지고있는 모든 구두점 문자가 없었습니다. 왜냐하면 그들은 비정상적인 알파벳 문자의 열쇠가 필요했기 때문입니다. 예를 들어 (이것을 만들고) 스웨덴 키보드에는 곱슬 브레이스가있는 A- 링이 있습니다.

이러한 사용자를 수용하기 위해 Trigraphs는 가장 일반적인 ASCII 문자 만 사용하여 구두점을 입력하는 방법입니다.

주로 C 표준이 1989 년에 Trigraphs가 일부 기계에 매핑하는 캐릭터의 존재에 문제가 있었을 때 1989 년에 소개했기 때문입니다. C ++ 표준이 1998 년에 출판되었을 때, Trigraphs의 필요성은 크지 않았습니다. 그들은 c에 대한 사마귀입니다. 그들은 C ++의 사마귀입니다. 특히 영어권 세계 밖에서 그들에게 필요한 것이 필요했습니다. 그래서 그들은 C에 추가 된 이유입니다.

그들은 주로 역사적 이유가 있습니다. 오늘날 대부분의 언어에 대한 대부분의 최신 키보드는 모든 캐릭터에 액세스 할 수 있지만 일부 유럽 키보드에서는 한 번 문제였습니다. 이것이 트리 그라프가 발명 된 이유입니다.

그들이 무엇을 위한지 모른다면, 당신은 그것들을 사용해서는 안됩니다.

그러나 실수로 그리고 의도하지 않게 코드에서 하나를 사용할 수 있기 때문에 여전히 알고있는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top