C ++에서 Trigraph 시퀀스의 목적은 무엇입니까?


127

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

다른 처리가 수행되기 전에 다음 세 문자 중 하나 ( "trigraph sequence") 중 하나가 표 1에 표시된 단일 문자로 바뀝니다.

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

실제로 는 문자 로 대체되는 3 중 시퀀스 이기 때문에 코드 printf( "What??!\n" );가 인쇄 됩니다.What|??!|

내 질문은 trigraphs를 사용하는 목적은 무엇입니까? trigraphs를 사용하면 실질적인 이점이 있습니까?

UPD : 대답에 따르면 일부 유럽 키보드에는 문장 부호 문자가 모두 없으므로 미국 이외의 프로그래머는 일상 생활에서 3 점을 사용해야합니까?

UPD2 : Visual Studio 2010에는 기본적으로 3 가지 그래프 지원이 해제되어 있습니다.


문장 부호 중 일부는 유럽식 키보드에서 도달하기가 더 어렵습니다 (일부 프로그래머가 미국 레이아웃을 사용하여 더 빨리 입력하는 점까지).
peterchen

2
일부 터미널 및 / 또는 가상화로 인해 일부 문자에 쉽게 액세스하지 못할 수 있습니다. 내 경험상 주범은 물결표입니다.
Francesco

1
내 DE- 데드 키 키보드에서 이것을 입력하면, #은 리턴 옆에있는 키이고, \는 "AltGr"+ "ß"(0 옆)이고 ^는 "^"+ "^"입니다 (데드 키 때문에; 1 옆) , [는 "AltGr"+ "8",]는 "AltGr"+ "9", | 는 "AltGr"+ "<"이고 {는 "AltGr"+ "7"이고}는 "AltGr"+ "0"이며 ~는 "~"+ "~"입니다 (데드 키 때문에 # 바로 위). 그렇게 큰 문제는 없습니다. 내 손가락은 이러한 조합을 스스로 입력하는 것과 같습니다
-D

1
두 개의 키보드 레이아웃을 가지고 컴퓨터에서 수행하는 작업에 따라 전환하는 것이 일반적이라고 생각했습니다. 중부 유럽 지역에서 일반적인 방법입니다. 이 3 가지 그래프를 사용하는 것은 꽤 소름 끼칩니다. 나는 이것을 표준에서 제거하기로 투표했다.
VX

답변:


97

밀접한 관련이있는이 질문에 대한이 질문에 대한 답이 있습니다.

ISO 646 문자 세트에 C 구문의 모든 문자가 포함되어 있지 않기 때문에 키보드를 사용하여 문자를 처리 할 수없는 일부 시스템이 있습니다 (단, 드문 것으로 생각합니다) 요즘).

일반적으로 사용하지 않아도되지만 발생한 문제에 대해 정확히 알고 있어야합니다. ' ?'문자에 이스케이프 시퀀스 가있는 이유는 3 점입니다 .

'\?'

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

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

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

그러나 두 개의 '?'를 입력 할 때 기억해야합니다. 당신이 3 그래프를 시작할지도 모르는 캐릭터 (그리고 내가 생각한 것은 결코 아닙니다).

실제로, 삼단 법 (trigraph)과 이력 (digraph)은 내가 매일 걱정하지 않는 것입니다. 그러나 몇 년에 한 번 당신은 그들과 관련된 버그에 빠질 것입니다 (그리고 당신은 그들의 존재를 저주하는 데 나머지 하루를 보낼 것입니다). trigraph 또는 digraph를 발견 할 때 컴파일러가 경고 (또는 오류)하도록 구성 할 수 있다면 좋을 것이므로 의도적으로 처리해야 할 것이 있음을 알 수 있습니다.

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

C / C ++ 프로그램에서 구두점을 사용하여 다양한 재미에 대한 훌륭한 교육을 받으려면 (나의 머리카락을 확실히 뽑아내는 3 가지 버그 포함) Herb Sutter의 GOTW # 86 기사를 살펴보십시오 .


추가:

GCC는 기본적으로 3 점을 처리하지 않으며 경고합니다. 일부 다른 컴파일러에는 3 가지 그래프 지원을 끄는 옵션이 있습니다 (예 : IBM). Microsoft는 VS2008에서 명시 적으로 활성화해야하는 경고 (C4837)를 지원하기 시작했습니다 (-Wall 등을 사용하여).


C와의 호환성이 유일한 이유는 무엇입니까? 현대적인 C ++ 프로그램에서 그것들을 만날 수 있습니까?
Kirill V. Lyadvinsky

그렇습니다. C ++는 3 가지 그래프와 Digraph도 지원합니다.
Michael Burr

4
내가 기억하는 것처럼, 내가 사용한 적어도 하나의 컴파일러 (g ++?)에는 trigraph 및 digraph가 변환되기 전에 명시 적 명령 행 옵션이 필요합니다. 그렇지 않으면 경고가 표시되지만 대체는 없습니다.
KTC

1
@ Jla3ep-개인적으로 필자는 3 점을 필요로하지 않았지만 불행히도 컴파일러는 코드를 처리하므로 실수로 사용하지 않도록 코드를 알고 있어야합니다. 또한 다른 곳에서 코드를 얻는 경우 의도적으로 사용하게 될 수도 있지만 이는 매우 드문 일입니다. 20 년 이상 한 번 의도적으로 사용 된 3 가지 그래프를 본 적이 있다고 생각합니다 (IBM 메인 프레임의 일부 코드였습니다).
Michael Burr

1
트리플 그래프가 놀라운 일을하기 위해 의견으로 확대 될 때 실제로 내 신경에 도달합니다.
여호수아

23

오늘 아이들! :-)

예, IBM 3270 터미널과 같은 외부 장비. 내가 기억한다면 3270에는 중괄호가 없습니다! IBM mini / 메인 프레임에 C를 쓰 려면 모든 블록 경계에 비틀린 삼중 그래프 사용해야했습니다. 다행히도 일부 IBM 미니 컴퓨터 기능 을 에뮬레이트 하기 위해 C로만 소프트웨어를 작성해야했지만 실제로 System / 36 에서 C 소프트웨어 작성하지는 않았습니다 .

"P"키 옆을보십시오 :

건반

흠. 말하기 어렵다. "캐리지 리턴"옆에 추가 버튼이 있으며 뒤로 가져갈 수도 있습니다. "["/ "]"쌍이 누락되었을 수 있습니다. 어쨌든이 키보드는 C를 써야한다면 슬픔을 일으킬 것입니다.

또한이 터미널은 ASCII가 아닌 IBM의 "기본"메인 프레임 문자 세트 인 EBCDIC을 표시합니다 (알림을위한 Pavel Minaev).

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


1
키보드에 재설정 버튼이 있습니다. 대단해! 그래도 내 관심을 끌었던 이상한.
l46kok

10
EBCDIC 머신에서 C ++ 17을 사용하려는 사람은 괴사로 감옥에 가야합니다.
SF.

플랫폼 에 ISO646 이외의 문자가없는 한, 모든 그래프로 수행 할 수있는 모든 것을 수행 할 수있는 것은 아니며, 모든 구현에서 백 슬래시 또는 C 문자 세트에없는 문자를 정의해야합니다. "메타"문자, 표준에서 백 슬래시에 대한 모든 참조를 "메타"로 바꾸고 ISO-646에없는 C 문자 세트의 멤버에 대해 백 슬래시 / 메타 이스케이프를 추가 하시겠습니까?
supercat

22

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

아스키 특수 문자 [, ], {, }, |, 및\ ISO에 의해 알파벳으로 지정된 문자 집합 위치를 차지한다. 대부분의 유럽 국가 ISO-646 문자 세트에서 이러한 위치는 영어 알파벳에서 찾을 수없는 문자로 채워집니다.

진정한 표준 최소 문자 집합을 사용하여 자국 문자를 이식 가능한 방식으로 표현할 수 있도록 일련의 삼분법이 제공됩니다. 프로그램 교환에 유용 할 수 있지만 사람들이 프로그램을 쉽게 읽을 수는 없습니다. 당연히이 문제에 대한 장기적인 해결책은 C ++ 프로그래머가 모국어와 C ++를 모두 잘 지원하는 장비를 얻는 것입니다. 불행히도, 이것은 일부에게는 불가능한 것으로 보이며, 새로운 장비의 도입은 매우 느리게 진행될 수 있습니다.


7
"새로운 장비의 도입은 매우 느리게 진행될 수 있습니다." 특히 프로그래밍 언어 기능을 표준화하는 빠르고 고통없는 프로세스와 비교할 때.
jforberg

4
키보드 레이아웃에 문제가 있다면, 타이핑 `과 같은 세 가지 그래프가 없다는 것이 재밌 습니다. 이탈리아어와 다른 키보드 레이아웃에서 빠진 타이핑 이 없습니다.
badp

15

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


2
그것은 내가 실제 생활에서 절대로 사용하지 않을 것이라는 의미입니까?
Kirill V. Lyadvinsky

1
너는 어떤 나라에 살고있어? 모든 언어의 모든 키보드에 필요한 키가있는 것은 아닙니다.
David Thornley

2
예. 그러나 문자열 리터럴에 넣을 때 예기치 않은 결과가 발생하는 경우 존재하는지 알고 있어야합니다.
CB Bailey

4
@David Thornley : 대부분의 최신 시스템은 C ++의 모든 기본 문자를 기존 위치에 있지 않거나 입력하기 위해 수정 자 시퀀스가 ​​필요한 경우에도 지원합니다. 문자를 실제로 시스템 문자 세트로 표현할 수없는 시스템의 소스 코드에서만 3 점을 유지해야했습니다. 나는 여전히 그러한 시스템이 매우 드물다고 주장한다.
CB Bailey

9

C ++ 0x에서 제거 할 수 있도록 Trigraph가 제안되었습니다. 즉, 여전히 그들을지지하는 강력한 논증이있는 것 같습니다 . 이것을 논의하는 C ++위원회 논문 N2910 을보십시오. 분명히, EBCDIC는 그들이 필요한 곳에 하나의 주요 거점입니다.


예, "외국어"입니다! :-)
Roboprog

그들은 "고객 피드백에 대한 내부 조사 결과"를 제외하고는 실제로 많은 것을 말하지는 않습니다. 그래도 EBCDIC이 여전히 널리 사용되는 것에 놀랐습니다 (그리고 이러한 시스템은 C ++ 0x 컴파일러를 사용할 것으로 예상합니다)
peterchen

5

필자는 90 년대 초에 PL / 1 프로그램을 메인 프레임에서 PC로 실행 / 컴파일 / 디버깅하기 위해 변환하는 데 사용 된 3 가지 그래프를 보았습니다.

그들은 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

그 프로그램은 파스칼로 작성된 것처럼 보일 것입니다. 그들은 단지 나를 재미있게 보았고 하루 종일 나에게 말하지 않을 것입니다. 나는 그들을 비난하지 않습니다. :)

트라이 그래프가 아닌 노력을 죽인 것은 플랫폼 간의 IO 시스템 차이점이었습니다. PC에서 파일을 여는 것은 메인 프레임과는 매우 달랐으며 동일한 코드를 양쪽에서 계속 실행하기에는 너무 많은 kludge를 도입했을 것입니다.


PL / 1 = IBM의 C 버전 (더 많거나 적음). 내 댓글을 볼 수 없습니다 : 하드의 IBM 단자에는이 '{'/ '}'키 :-( 종류는 달리, 이들 중 하나에 C를 [++] 씁니다.
Roboprog

3

주로 C 표준이 1989 년에 일부 언어를 표시하는 문자가 존재하는 문제가 발생했을 때 C 표준을 다시 도입했기 때문입니다. C ++ 표준이 1998 년에 출판 될 당시에는 3 점의 필요성이 크지 않았습니다. 그들은 C에 대한 사마귀입니다. 그들은 C ++에 대한 사마귀입니다. 영어권 세계 이외의 지역에서 이들을 필요로했기 때문에 C에 추가되었습니다.


1
나는 항상 :-) IBM 영어를하지 않았다는 것을 의심 한
Roboprog

3

일부 유럽 키보드에는 특이한 알파벳 문자의 키가 필요했기 때문에 미국 키보드에 사용 된 모든 문장 부호 문자가 없습니다 (하지 않았습니까?). 예를 들어 (이걸 만들어 내기) 스웨덴어 키보드에는 중괄호가있는 A 링이 있습니다.

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


4
Trigraphs는 실제로 데이터 입력에 관한 것이 아니며 (코드를 읽을 수 없게 만듭니다) 실제로 필요한 문자가없는 시스템에 관한 것입니다. 키 시퀀스와 같은 삼중 그래프를 입력해야하더라도 시스템이 문자를 기록하고 표시 할 수있는 경우 소스에 삼중 시퀀스를 유지하지 않는 것이 훨씬 쉽습니다.
CB Bailey

2

그들은 주로 역사적 이유가 있습니다. 오늘날 대부분의 언어에 대한 대부분의 최신 키보드는 이러한 모든 문자에 대한 액세스를 허용하지만 일부 유럽 키보드에서는 한 번 문제가되었습니다. 이것이 trigraphs가 발명 된 이유입니다.

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

그러나 실수로 실수로 코드에서 하나를 사용할 수 있기 때문에 여전히 알아 두는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.