Триграфы более проблематичны для неосведомленного пользователя, чем орграфы. Это потому, что они заменяются внутри строковых литералов и комментариев. Вот несколько примеров…
Пример А:
std::string example = "What??!??!";
std::cout << example << std::endl;
What||
будет напечатано на консоли. Это связано с тем, что триграф ??!
переводится в |
.
Пример Б:
// Error ?!?!?!??!??/
std::cout << "There was an error!" << std::end;
Вообще ничего не будет. Это связано с тем, что ??/
преобразуется в \
, который экранирует символ новой строки и приводит к тому, что следующая строка закомментируется.
Пример C:
// This makes no sense ?!?!!?!??!??/
std::string example = "Hello World";
std::cout << example << std::endl;
Это даст ошибку типа use of undeclared identifier "example"
по тем же причинам, что и в примере B.
Есть гораздо более сложные проблемы, которые могут вызвать триграфы, но вы поняли идею. Стоит отметить, что многие компиляторы фактически выдают предупреждение при выполнении таких переводов; еще одна причина всегда рассматривать предупреждения как ошибки. Однако это не требуется стандартом, и поэтому на него нельзя полагаться.
Орграфы гораздо менее проблематичны, чем триграфы, так как они не заменяются внутри другого токена (т. е. строкового или символьного литерала) и нет последовательности, которая транслируется в \
, поэтому экранирование новых строк в комментариях невозможно.
Заключение
Помимо того, что код сложнее читать, орграфы вызывают меньше проблем, и поэтому потребность в их удалении значительно снижается.
person
OMGtechy
schedule
20.01.2015