[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