[P&AM Lab] Echo.c
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Пн Дек 6 23:22:26 MSK 2010
Отлично, отлично.
Это директивы препроцессора. Они дают возможность делать условную
компиляцию. Если при компиляции был определён символ препроцессора
ENABLE_FEATURE_FANCY_ECHO, то из исходного файла будут включены участки
кода так:
#if !ENABLE_FEATURE_FANCY_ECHO
код здесь будет пропущен
#else
код отсюда пойдёт на компиляцию
#endif
У busybox есть своя система конфигурирования сборки, т.к. вариантов того
что нужно на конкретную платформу может быть много. Она запускается из
корневого каталога так:
$ pwd
/home/sitkarev/Downloads/busybox/busybox-1.10.2
$ make menuconfig
Если там дальше зайти в меню в Coreutils и потом спуститься вниз где
конфигурируется сборка echo, там будет опция 'Enable echo options (-n
and -e)'. Если посмотреть по ней Help, то там видно что эта опция
включает символ FEATURE_FANCY_ECHO, а в сборке echo тогда будут
обрабатываться опции -n и -e. В спецификации SuSv3 у echo нет опций
вообще, но в некоторых реализациях они есть, например в родной echo на
Linux. Они соответственно выключают вывод newline и включают
интерпретацию escape-последовательностей '\' как специальных символов
(например \t или \b) включая 8-ные коды (\0777).
При запуске gcc потом ему будет передана опция:
$ gcc -Wall -DENABLE_FEATURE_FANCY_ECHO ...
Примерно так, а это значит что для препроцессора будет установлен символ
ENABLE_FEATURE_FANCY_ECHO и соответствующий код будет компилирован. Там
можно символу препроцессора установить и значение какое-то, но здесь это
не нужно. Это равносильно тому что вы в начале исходного файла сделали так:
#define ENABLE_FEATURE_FANCY_ECHO
Старайтесь внимательнее смотреть сами исходные тексты и особенно
комментарии. Там в самом начале содержится такая информация:
/* Mar 16, 2003 Manuel Novoa III (mjn3 на codepoet.org)
*
* Because of behavioral differences, implemented configurable SUSv3
* or 'fancy' gnu-ish behaviors. Also, reduced size and fixed bugs.
* 1) In handling '\c' escape, the previous version only suppressed the
* trailing newline. SUSv3 specifies _no_ output after '\c'.
* 2) SUSv3 specifies that octal escapes are of the form \0{#{#{#}}}.
* The previous version did not allow 4-digit octals.
*/
--
Г.А.
Борис Липин пишет:
> Григорий Александрович, здравствуйте.
> Возникла пара вопросов в процессе разбора сорсов echo. Основной алгоритм вроде бы понятен, но пара строчек всё же вызывает вопросы.
> Совсем не понятно что значит строка: #if !ENABLE_FEATURE_FANCY_ECHO
> и зачем вообще нужно было вводить ветвления #if.... #else...#endif.
Подробная информация о списке рассылки Lab