2014-12-22 6 views
18

C++ 1z는 삼부작을 제거합니다. IBM은이 문제 (herehere)에 반대하여 제거/제거의 양면에 대한 인수가있는 것으로 보입니다.C++ 1z 왜 trigraphs와 함께 digraphs를 제거하지 않습니까?

그러나 trigraphs를 삭제하기로 결정한 후 왜 유적 그래프를 남겨 두지 않습니까? 트라이 그래프를 유지해야 할 이유를 넘어서서 다이 그래프를 유지할 이유는 없습니다 (분명히 무게를 유지하지 못했습니다).

+13

거의 크리스마스이므로, 수염을 가진 스마일을 허용하지 않는 것이 슬픈 일입니다. – rightfold

+1

trigraphs는 _deprecated_이며 _removed_는 아닙니다. 나는 그 아이디어를 사용하여 새로운 코드에서이 코드를 사용하는 것을 중지시키고 오래된 코드를 가진 개발자가 결국 마이그레이션하게하는 아이디어를 얻는 것이라고 생각한다. 그들은 코드를 깨뜨리지 않을 것입니다 - 이유는 다음과 같습니다. 언어를 조금 더 크고 혼란스럽게 만드는 똑같은 일을하는 또 다른 방법 일뿐입니다. –

+0

@BenjaminGruenbaum 내가 아는 한, 그들은 C++로 완전히 사라질 것입니다. 17 – Xeo

답변

27

트라이 그래프는 다이 그래프 대신 인식되지 않은 사용자에게 더 문제가됩니다. 이것은 문자열 리터럴 및 주석 내에서 대체되기 때문입니다.

std::string example = "What??!??!"; 
std::cout << example << std::endl; 

What|| 콘솔에 인쇄 될 다음은 몇 가지 예 ...

예 A이다. 이는 의 트라이 그래프가 |으로 번역 되었기 때문입니다.

예 B :

// Error ?!?!?!??!??/ 
std::cout << "There was an error!" << std::end; 

아무것도 전혀 발생하지 않습니다. 이는 ??/\으로 변환되어 줄 바꿈 문자를 이스케이프하고 다음 줄이 주석 처리되도록하기 때문입니다.

예 C :이 예 B. 같은 이유로 use of undeclared identifier "example"의 라인을 따라 오류를 줄 것이다

// This makes no sense ?!?!!?!??!??/ 
std::string example = "Hello World"; 
std::cout << example << std::endl; 

이 trigraph를 너무 될 수 있습니다 훨씬 더 정교한 문제가 있지만, 당신은 아이디어를 얻습니다. 실제로 많은 컴파일러가 그러한 번역을 할 때 실제로 경고를 내 보냅니다. 경고를 항상 오류로 취급하는 또 다른 이유입니다. 그러나 이것은 표준에 의해 요구되지 않으므로 의존 할 수 없습니다.

다이 그래프는 다른 토큰 (즉, 문자열 또는 문자 리터럴) 내에서 대체되지 않으며 \으로 변환되는 시퀀스가 ​​없으므로 주석에서 새 줄을 이스케이프 처리 할 수 ​​없기 때문에 트라이 그래프보다 문제가 적습니다. 코드를 읽기 어렵게 이외의

결론

덜 이중 음자로 인한 문제 때문에 제거 할 필요가 크게 감소되어있다.