CPROTO(1) CPROTO(1) NAME cproto - утилита генерации прототипов "C" функций и конвертации определений функций. SYNOPSIS cproto [option ...] [file ...] DESCRIPTION Утилита cproto выводит прототипы функций, определенных в заданных исходных файлах "C" на стандартное устройство вывода. Функции могут определяться как в старом стиле, так и в ANSI "C" стиле. Опционально, утилита cproto выводит объявления и для переменных, определенных в заданных исходных файлах. Если имя входного файла не задано, то в качестве исходного файла используется стандартное устройство ввода. Кроме того, если заданы соответствующие опции командной строки, то cproto конвертирует определения функций из старого стиля в стиль ANSI "C". При этом сгенерированным кодом будут замещены как первоначальные исходные файлы (указанные из командной строки) так и файлы, задаваемые с помощью директив: #include "file" Если в командной строке имена файлов отсутствуют, то программа cproto читает исходный текст из стандартного ввода, и выдает преобразованный текст на стандартной вывод. Если для параметра функции приведен комментарий, например: main (argc, argv) int argc; /* number of arguments */ char *argv[]; /* arguments */ { } то после конвертации функция будет иметь следующий вид: int main ( int argc, /* number of arguments */ char *argv[] /* arguments */ ) { } В противном случае (параметры функции заданы без комментариев), конвертированная функция будет выглядеть следующим образом: int main (int argc, char *argv[]) { } Опционально cproto может конвертировать определения функций из ANSI C стиля в старый стиль. В этом режиме, программа также конвертирует объявления функций и прототипы, которые определены вне функций. Таким образом, в данном режиме преобразование от ANSI C к старому стилю не является полным преобразованием, так как программа не модифицирует тело функции. Опционально cproto может генерировать исходные тексты в lint - формате (lint-library format). Это полезно в тех случаях, когда утилита lint используется для проверки прототипов функций вашей программы. OPTIONS -e Выводить ключевое слово extern перед каждым сгенерированным прототипом или объявлением. -f n Установить стиль генерируемых прототипов функций, где n - число от 0 до 3. Например, для функции main (argc, argv) int argc; char *argv[]; { } Значение n равное 0 приведет к тому, что прототип не будет сгенерирован. Когда параметр n установлен в 1, то будет сгенерировано: int main(/*int argc, char *argv[]*/); Когда параметр n установлен 2, то прототип функции будет иметь вид: int main(int /*argc*/, char */*argv*/[]); Значение по умолчанию - 3, что приводит к генерации следующего прототипа функции: int main(int argc, char *argv[]); -l Генерировать текст для lint - библиотеки (переопределяет опцию "-f"). Результирующий код включает комментарий /* LINTLIBRARY */ Специальные комментарии LINT_EXTERN и LINT_PREPRO ("VARARGS") соответственно включают опцию "-x" и копируют текст комментария в результирующий код (для обработки предпроцессором в lint). Комментарий /* LINT_EXTERN2 */ используется для включения функций, переменных определенных как extern, в include файлах первого уровня. Комментарий /* LINT_SHADOWED */ заставлять cproto размещать директивы "#undef" перед каждым объявлением lint библиотеки (то есть, позволяет избегать конфликтов с macros-ами, которые могут иметь то же самое имя, что и функция). Обратите внимание, что данные специальные комментарии не поддерживаются под VAX/VMS, как под VAX-C нет никакого эквивалента опции cpp "-C". -c комментарии для параметров в прототипах, сгенерированных с помощью опций -f1 и -f2 по умолчанию опускаются. Данную опцию следует использовать для того, чтобы разрешить вывод данных комментариев. -m разместить макро вокруг списка параметра для каждого сгенерированного прототипа. Например: int main P_((int argc, char *argv[])); -M name Задает имя макро, используемого совместно с опцией -m. Значение по умолчанию - "P_". -d Опустить определение прототипа макро используемого опцией -m. -o file Задает имя выходного файла (значение по умолчанию: стандартное устройство вывода). -O file Задает имя файла ошибки (значение по умолчанию: стандартная ошибка). -p Отключение перевода формальных параметров в функциях определенных в старом стиле. По умолчанию, параметры типа char или short в функциях, объявленных в старом стиле преобразуются в тип int в прототипе функции или прототип функции преобразуется в ANSI C прототип. Параметры типа float преобразуются в тип double. -q Не выводить сообщения об ошибке, если программа не может считать файл, указанный в директиве #include. -s По умолчанию, cproto генерирует объявления для функций и переменных, которые имеют глобальный контекст. Использование данной опции приводит к тому, что будут также выданы и статические объявления. -S Сгенерировать только статические объявления. -T Копировать определения типов для каждого файла. (Определения во включаемых файлах также копируются). -v Выводить также объявления для переменных, определенных в исходном файле. -x Данная опция приводит к тому, что процедуры и переменные, которые объявлены как "extern" включаются в результирующий код. -a Конвертирует определения функции от старого стиля в стиль ANSI C. -t Конвертирует определения функций из ANSI C стиля в традиционный стиль. -b Переписывает определение функции, для того чтобы включить, как определение в старом стиле, так и определение в новом стиле, используя директивы условной компиляции. Пример, сгенерированного выходного кода: #ifdef ANSI_FUNC int main (int argc, char *argv[]) #else int main (argc, argv) int argc; char *argv[] #endif { } -B directive Устанавливают директиву условной компиляции, используемую опцией -b. Значение по умолчанию #ifdef ANSI_FUNC -P template -F template -C template Устанавливает выходной формат для генерируемых прототипов, определений функций, и определений функций с комментариями параметров. Формат задается шаблоном вида " int f ( a, b )" Но вы можете заменить каждый пробел в этой стоке любым количеством символов whitespace (пробел, табуляция, перевод строки). Например, опция -F"int f(\n\ta,\n\tb\n\t)" приведет к генерации следующего определения функции: int main( int argc, char *argv[] ) -D name[=value] Данная опция передается предпроцессору и используется, для определения символов условной компиляции. -U name Данная опция передается предпроцессору и используется, для удаления определений символа name. -I directory Данная опция передается предпроцессору и используется, для определения каталога, в котором следует искать файлы, заданные с помощью директивы #include. -E cpp При генерации прототипов пропустить входные файлы через указанный предпроцессор "C". По умолчанию, используется /lib/cpp. -E 0 Не использовать "C" предпроцессор. -V Выдает номер версии. ENVIRONMENT Переменная окружающей среда CPROTO просматривается на наличие списка опций. Предполагается, что опции задаются в том же самом формате, что и опции, задаваемые в командной строке. Опции, заданные из командной строки переопределяют значения заданные из переменной окружающей среды. BUGS Если не теговая структура, union или enum появляются в сгенерированном прототипе функции или в сконвертированном определении функции, содержимое декларации между фигурными скобками пусто. Программа не пропускает исходные файлы через предпроцессор языка C, при преобразовании определений функций. Вместо этого, данная программа пытается самостоятельно обработать директивы предпроцессора, macros-ы, что может привести к ошибкам расширения сложных макро. Также при преобразовании откидываются некоторые комментарии в голове определения функций. Опция -v не генерирует объявлений для переменных, определенных с помощью extern. Это не соответствует стандарту C, но это было реализовано, из-за того, что включаемые файлы, обычно объявляют переменные таким способом. Когда программа сталкивается с ошибкой, то обычно генерируется не слишком наглядное сообщение " syntax error ". Опции, которым передаются строковые аргументы, интерпретируют только следующие escape последовательности: \n новая строка \s пробел \t табуляция Комментарии VARARGS не допускаются на системах, чьи C предпроцессоры не поддерживают данные комментарии (например, VAX/VMS, MS DOS). AUTHOR Chin Huang cthuang@vex.net cthuang@interlog.com Thomas Dickey dickey@clark.net modifications to support lint library, type-copying, and port to VAX/VMS. SEE ALSO cc(1), cpp(1) January 1998 CPROTO(1) Ttranslated to Russian in 2004 by Dmitry Cherkashin dch@ucrouter.ru