Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

Пакет

dbug
требует от вас использования определенного порядка при написании своего кода. В частности, нужно использовать его макросы при возвращении из функции или вызове
setjmp
и
longjmp
. Нужно добавлять один вызов макроса в качестве первого исполняемого оператора каждой функции и вызвать несколько дополнительных макросов из
main
. Наконец, нужно добавить отладочную опцию командной строки, по соглашению, это
– #
, которая редко используется в качестве действительной опции, если вообще используется. В обмен на дополнительную работу вы получаете все только что очерченные преимущества. Давайте взглянем на пример в руководстве:

1 #include <stdio.h>

2 #include "dbug.h"

3

4 int

5 main(argc, argv)

6 int argc;

7 char *argv[];

8 {

9 register int result, ix;

10 extern int factorial, atoi;

11

12 DBUG_ENTER("main");

13 DBUG_PROCESS(argv[0]);

14 DBUG_PUSH_ENV("DBUG");

15 for (ix = 1; ix < argc && argv[ix][0] == '-'; ix++) {

16 switch (argv[ix][1]) {

17 case '#':

18 DBUG_PUSH(&(argv[ix][2]));

19 break;

20 }

21 }

22 for (; ix < argc; ix++) {

23 DBUG_PRINT("args", ("argv[%d] = %s", ix, argv[ix]));

24 result = factorial(atoi(argv(ixj));

25 printf("%d\n", result);

26 fflush(stdout);

27 }

28 DBUG_RETURN(0);

29 }

Эта программа иллюстрирует большинство важных моментов. Макрос

DBUG_ENTER
(строка 12) должен быть вызван после объявлений переменных и перед любым другим кодом. (Это потому, что он сам объявляет несколько частных переменных. [176] )

176

В C99, который допускает смешивание объявлений переменных с исполняемым кодом, это составляет меньшую проблему, но помните, что этот пакет был разработан для K&R С — Примеч. автора.

Макрос

DBUG_PROCESS
(строка 13) устанавливает имя программы, главным образом, для использования в выводимых библиотекой сообщениях. Этот макрос должен вызываться лишь однажды, из
main
.

Макрос

DBUG_PUSH_ENV
(строка 14) заставляет библиотеку проверить указанную переменную окружения (в данном случае
DBUG
) на предмет управляющей строки (Управляющие строки
dbug
вскоре будут рассмотрены.) Библиотека может, сохранив свое текущее состояние и использовав новое, создавать стек сохраненных состояний. Таким образом, этот макрос помещает в стек сохраненных состояний полученное от данной переменной окружения состояние. В данном примере использован случай, когда макрос создает первоначальное состояние. Если такой переменной окружения нет, ничего не происходит. (В качестве отступления,
DBUG
является довольно общей переменной, возможно,
GAWK_DBUG
было бы лучше [для
gawk
].)

Макрос

DBUG_PUSH
(строка 18) передает значение управляющей строки, полученной из опции командной строки
– #
. (Новый код должен использовать
getopt
или
getopt_long
вместо ручного анализа аргументов.) Таким образом обычно включается режим отладки, но использование переменной окружения предоставляет также дополнительную гибкость.

Макрос

DBUG_PRINT
(строка 23) осуществляет вывод. Второй аргумент использует методику, которую мы описали ранее (см. раздел 15.4.1.1 «Используйте отладочные макросы»), по включению в скобки всего списка аргументов
printf
, делая его простым аргументом, насколько это касается препроцессора С. Обратите внимание, что завершающий символ конца строки в форматирующей строке не указывается; библиотека
dbug
вставляет его за вас.

При печати

dbug
по умолчанию выводит все операторы
DBUG_PRINT
. Первый аргумент является строкой, которая может использоваться для ограничения вывода лишь теми макросами
DBUG_PRINT
, которые используют эту строку.

Наконец, макрос

DBUG_RETURN
(строка 28) используется вместо обычного оператора
return
для возврата значения. Для использования с функциями
void
имеется соответствующий макрос
DBUG_VOID_RETURN
.

Оставшаяся часть программы заполнена функцией

factorial
:

1 #include <stdio.h>

2 #include "dbug.h"

3

4 int factorial (value)

5 register int value;

6 {

7 DBUG_ENTER("factorial");

8 DBUG_PRINT("find", ("find %d factorial", value));

9 if (value > 1) {

10 value *= factorial(value — 1);

  • Читать дальше
  • 1
  • ...
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: