2014-12-22 18 views
18

C++ 1z usuwa trigraphy. IBM mocno się temu sprzeciwiał (here i here), więc wydaje się, że istnieją argumenty za usunięciem/usunięciem obu stron.C++ 1z dlaczego nie usunąć digrafów wraz z trigrafami?

Ale od kiedy podjęto decyzję o usunięciu trigrafów, po co zostawiać digrafy? Nie widzę powodów, dla których utrzymywanie digrafów wykracza poza przyczyny utrzymywania trigrafów (które najwyraźniej nie były wystarczająco ciężkie, aby je utrzymać).

+13

Prawie świąteczne, więc niedozwolone buźki z brodami będą smutne. – rightfold

+1

Należy zauważyć, że trigraphy są _deprecowane_, a nie _removed_. Myślę, że chodzi o to, aby zachęcić ludzi, którzy mogą ich używać, do zaprzestania ich używania w nowym kodzie i do ostatecznego przekonania programistów, którzy mają stary kod do migracji. Nie będą łamać kodu - i dlaczego: jest to po prostu inny sposób na zrobienie tego samego, co sprawia, że ​​język jest odrobinę większy i bardziej zagmatwany. –

+0

@BenjaminGruenbaum O ile mi wiadomo, nie będzie ich całkowicie w C++ 17 – Xeo

Odpowiedz

27

Trigraphy są bardziej problematyczne dla nieświadomego użytkownika niż dwuznak. Dzieje się tak dlatego, że są one zastępowane w literałach i komentarzach tekstowych. Oto kilka przykładów ...

Przykład A:

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

What|| zostanie wydrukowany do konsoli. Jest tak dlatego, że trigraph ??! jest tłumaczony na |.

Przykład B:

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

Nic się nie stanie w ogóle. Dzieje się tak dlatego, ponieważ ??/ tłumaczy się na \, który wymyka się znakowi nowego wiersza i powoduje skomentowanie następnej linii.

Przykład C:

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

ta daje błąd wzdłuż linii use of undeclared identifier "example" tych samych przyczyn jak w przykładzie B.

Jest o wiele bardziej złożone problemy trójznaków mogą powodować także, ale Masz pomysł. Warto zauważyć, że wiele kompilatorów faktycznie wysyła ostrzeżenie podczas wykonywania takich tłumaczeń; jeszcze jeden powód, aby traktować ostrzeżenia jako błędy. Jednak nie jest to wymagane przez standard i dlatego nie można na nim polegać.

Wykładziny są znacznie mniej problematyczne niż trigrafy, ponieważ nie są zastępowane wewnątrz innego tokenu (tzn. Ciąg znaków lub literał znaków) i nie ma sekwencji, która tłumaczy się na \, więc nie ma możliwości uniknięcia nowych linii w komentarzach.

Wnioski

Inne niż trudniejsze do odczytania kodu, są mniej problemów spowodowanych przez digrafach i dlatego trzeba je usunąć jest znacznie zmniejszona.