Трюки от Крыса Крис Касперски Хакер, номер #103, стр. 103-120-2 Решетка («#») кодируется двоеточием, следующим за знаком процента (смотри таблицу 2). Остальные же символы – «\», «^», «|» и «~» - не получили адекватной репрезентации и по-прежнему должны кодироваться через триграфы, что, впрочем, не создает большой проблемы в силу их невысокой распространенности (по сравнению с фигурными и угловыми скобками). Конечно, тут можно поспорить, попинать разработчиков Стандарта и вообще развести флейм на шестьсот квадратных миль, но… против Священного Писания (Стандарта в смысле) не попрешь, несмотря на то что в настоящее время не имеется ни одного компилятора, в полной мере поддерживающего С99. Пример программы, написанной с использованием диграфов (точнее, смеси диграфов и триграфов), приведен ниже: Исходный текст программы, написанной с использованием ди- и триграфов %:include <stdio.h> /* # */ int main(void) <% /* { */ char n<:5:>; /* [ и ] */ n<:4:> = '0' - (??-0 ??' 1 ??! 2); /* ~, ^ и | */ printf("%c??/n", n<:4:>); /* ??/ = \ */ printf("%:%:%:"); ??> Попытка ее трансляции компиляторами Microsoft Visual C++ и Borland C++ вызывает сообщение об ошибке и проваливается. Ничего не поделаешь, эти компиляторы диграфов не переваривают! Последние версии GCC выполняют постановку диграфов везде, за исключением строковых констант. Причем попытка использования ключа ‘-digraphs’ не решает проблемы, поскольку этот ключ предназначен для вывода внутренней отладочной информации, генерируемой компилятором в ходе трансляции программы и интересной главным образом его разработчикам. В Сети встречается достаточно много исходных текстов программ, написанных под UNIX (а UNIX — это синоним GCC) с использованием диграфов. Возникает резонный вопрос: и как же это чудо прогресса портировать на Windows? Можно, конечно, посоветовать версию GCC для win32, но это будет плохой совет. Особенно если из программы требуется вырезать всего один кусок в надежде вставить его в готовый проект на Microsoft Visual C++, который, между прочим, компилятор GCC, скорее всего, не захочет транслировать, в особенности если программист активно использовал нестандартные расширения от Microsoft (а поскольку мало кто изучает Си по Стандарту, практически все мы используем те или иные расширения, зачастую даже не подозревая об их нестандартности). В действительности решение состоит в создании простейшего внешнего препроцессора, выполняющего «сквозной» поиск диграфов и заменяющего их соответствующими им символами. Если препроцессор писать лень, эту операцию можно осуществить в любом текстовом редакторе через Replace. Совет 3: диграфы и шаблоны В отношении Си диграфы лексически нейтральны. Они не нарушают целостности языка и гарантируют отсутствие коллизий: ни при каких обстоятельствах никакой диграф не может пересекаться ни с одной родной конструкцией языка, что совсем неудивительно, поскольку именно для Си диграфы и разрабатывались. |