Какой синтаксис C использует код? - PullRequest
1 голос
/ 24 февраля 2012
local uLong unzlocal_SearchCentralDir OF((
    const zlib_filefunc_def* pzlib_filefunc_def,
    voidpf filestream));

local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
    const zlib_filefunc_def* pzlib_filefunc_def;
    voidpf filestream;
{

... источник отдыха.

Приведенный выше источник C взят из unzip.c.

Мне интересно, каков синтаксис строки прототипа функции? Особенно откуда взялась клавиша "OF" или для чего она нужна?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Поиск через заголовки для строки:

#define OF(x) ...

Здесь x и ... могут быть чем-то другим.OF это не ключевое слово, это макрос.От "zconf.h":

#ifndef OF /* function prototypes */
#  ifdef STDC
#    define OF(args)  args
#  else
#    define OF(args)  ()
#  endif
#endif

Используется для того, чтобы один и тот же код компилировался как на компиляторах ANSI C (1989 или более поздней версии), так и до компиляторов до ANSI C (до 1989 года).Мы больше не заботимся о старых компиляторах, но zlib существует уже давно (с 1995 года), и они еще не отказались от поддержки старых компиляторов.Подобные определения вы найдете в LibPNG.

В 1995 году DOS все еще был довольно распространен на настольных ПК.Теперь нет смысла программировать таким образом.

1 голос
/ 24 февраля 2012

В этом коде интересны две вещи: слова local и OF.

Слово local по умолчанию от #define d до static в gzguts.h.Комментарий объясняет, почему:

#ifndef local
#  define local static
#endif
/* compile with -Dlocal if your debugger can't find static symbols */

Итак, мы пришли к выводу, что кто-то в прошлом должен был использовать отладчик, который плохо обрабатывал статические функции.Вы можете скомпилировать zlib со всеми глобальными функциями, чтобы обойти эту проблему.

Слово OF равно #define d в zconf.h:

#ifndef OF /* function prototypes */
#  ifdef STDC
#    define OF(args)  args
#  else
#    define OF(args)  ()
#  endif
#endif

Это определение позволяет zlib бытьскомпилированы с предварительно ANSI-стандартными компиляторами, которые не поддерживают прототипы функций.В пре-ANSI C объявление функции должно было выглядеть так:

uLong unzlocal_SearchCentralDir();

независимо от того, какие параметры принимает функция.Этот макрос позволяет объявлять функции с их списками аргументов прототипа, но списки аргументов удаляются, если компилятор не поддерживает ANSI C.

1 голос
/ 24 февраля 2012

Макро-код для успешной работы на нескольких компиляторах.

local несомненно #define local static на большинстве платформ.

OF оставляет параметры неизменными на большинстве современных компиляторов, но со старыми параметрами стиля K & R-only он будет преобразовывать unzlocal_SearchCentralDir OF(const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream) в

   unzlocal_SearchCentralDir (pzlib_filefunc_def, filestream)
      const zlib_filefunc_def* pzlib_filefunc_def;
      voidpf filestream;
   {  // begin function body...
...