четверг, 6 августа 2009 г.

Trigraph sequences in C++

C++ стандарт в части 2.3/1 утверждает, что перед началом любой обработки кода все вхождения трех символов, указанных в таблице, будут заменены на один соответствующий символ.

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??= | # | ??( | [ | ??< | { |
| ??/ | \ | ??) | ] | ??> | } |
| ??’ | ˆ | ??! | | | ??- | ˜ |
----------------------------------------------------------------------------
На практике это означает, что если даже в строковой константе встретится такая последовательность, то последствия могут оказаться неожиданными. Например, такой код:
printf( "What??!\n" )
Выдаст пользователю такой текст:
What|
Помимо этого есть такая же таблица для пар символов, которая делает следующий код вполне корректной программой на С++:
%:include <stdio.h>

%:ifndef BUFSIZE
%:define BUFSIZE 512
%:endif

void copy(char d<::>, const char s<::>, int len)
<%
while (len-- >= 0)
<%
d<:len:> = s<:len:>;
%>
%>
Стандарт поддерживает эти символы для совместимости, т.к. на очень старом железе в Европе не было части символов. Интересно, что в будущем стандарте С+x0 было предложено отказаться от поддержки триграфов, однако, этого видимо не произойдет. Подробнее тут.

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

2 коммент.:

0xc0de комментирует...

Clicked on your profile at stackoverflow (I'm user ltcmelo) and decided to check around your blog... Then I realized it would take me some time to learn russian. ;)

jia3ep комментирует...

Well, seems to be stackoverflow is the only place where all developers talk in English ;)