C ++ 1z, почему бы не удалить орграфы вместе с триграфами?

C ++ 1z удалит триграфы. IBM категорически против этого (Вот а также Вот) так что, кажется, есть аргументы для обеих сторон удаления / не удаления.

Но поскольку было принято решение убрать триграфы, зачем оставлять оргографы? Я не вижу каких-либо причин для сохранения орграфов, кроме причин сохранять триграфы (которые явно недостаточно весили, чтобы их хранить).

21

Решение

Триграфы более проблематичны для неосведомленного пользователя, чем орграфы. Это потому, что они заменяются строковыми литералами и комментариями. Вот несколько примеров…

Пример А:

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

What|| будет напечатан на консоли. Это из-за триграфа ??! переводится на |,

Пример Б:

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

Ничего не случится вообще. Это потому что ??/ переводит на \, который экранирует символ новой строки и приводит к закомментированию следующей строки.

Пример С:

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

Это даст ошибку в соответствии с use of undeclared identifier "example" по тем же причинам, что и в примере B.

Есть гораздо более сложные проблемы, которые могут вызвать триграфы, но вы понимаете. Стоит отметить, что многие компиляторы фактически выдают предупреждение при выполнении таких переводов; Еще одна причина, чтобы всегда рассматривать предупреждения как ошибки. Однако это не требуется стандартом и, следовательно, на него нельзя положиться.

Диграфы гораздо менее проблематичны, чем триграфы, поскольку они не заменяются внутри другого токена (то есть строки или символьного литерала), и нет последовательности, которая переводила бы в \поэтому экранирование новых строк в комментариях не может произойти.

Заключение

Помимо трудного для чтения кода, есть меньше проблем, вызванных орграфами, и, следовательно, необходимость их удаления значительно уменьшается.

31

Другие решения