Trigraphs có nhiều vấn đề đối với người dùng không biết hơn so với các hình vẽ. Điều này là do chúng được thay thế trong các chuỗi ký tự và nhận xét. Dưới đây là một số ví dụ ...
Ví dụ A:
std::string example = "What??!??!";
std::cout << example << std::endl;
What||
sẽ được in ra cửa sổ Console. Điều này là do các dấu phẩy ??!
được dịch sang |
.
Ví dụ B:
// Error ?!?!?!??!??/
std::cout << "There was an error!" << std::end;
Không có gì sẽ xảy ra ở tất cả. Điều này là do ??/
chuyển thành \
, thoát khỏi ký tự dòng mới và kết quả trong dòng tiếp theo được nhận xét.
Ví dụ C:
// This makes no sense ?!?!!?!??!??/
std::string example = "Hello World";
std::cout << example << std::endl;
này sẽ đưa ra một lỗi dọc theo dòng của use of undeclared identifier "example"
vì những lý do tương tự như ví dụ B.
Có những vấn đề xa phức tạp hơn trigraphs có thể gây ra quá, nhưng bạn có được ý tưởng. Cần lưu ý rằng nhiều trình biên dịch thực sự phát ra một cảnh báo khi các bản dịch đó đang được thực hiện; một lý do khác để luôn coi cảnh báo là lỗi. Tuy nhiên điều này không được yêu cầu bởi tiêu chuẩn và do đó không thể dựa vào.
Đồ họa ít vấn đề hơn so với dấu vết, vì chúng không được thay thế bên trong mã thông báo khác (ví dụ: chuỗi hoặc ký tự) và không có chuỗi chuyển thành \
, vì vậy không thể xuất hiện dòng mới trong nhận xét.
Kết luận
Ngoài khó khăn hơn để đọc mã, có những vấn đề ít gây ra bởi chữ ghép và do đó cần phải loại bỏ chúng sẽ giảm đáng kể.
Đó là gần Giáng sinh, vì vậy việc không cho phép mặt cười có râu sẽ rất buồn. – rightfold
Lưu ý rằng các dấu phẩy đang được _deprecated_ và không _removed_. Tôi nghĩ rằng ý tưởng là để có được những người có thể sử dụng chúng để ngừng sử dụng chúng trong mã mới và để có được các nhà phát triển với mã cũ để di chuyển cuối cùng. Họ sẽ không phá vỡ mã - vì lý do tại sao: nó chỉ là một cách khác để làm điều tương tự mà làm cho ngôn ngữ chỉ là một chút lớn hơn và khó hiểu hơn. –
@BenjaminGruenbaum Theo như tôi biết, chúng sẽ biến mất hoàn toàn trong C++ 17 – Xeo