Разъсните по прототипам, значение аргументов

Автор Utility, 09 июня 2015, 20:37:03

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Utility

Есть GCC, в руководстве к GCC указаны прототипы.
Прототип состоит из функции типов и аргументов.
Типы являются частью языка С, в то впемя как аргументы есть результат обозначения по соглашению.
Объясните, мне дураку, как правильно смотреть и понимать аргументы, например здесь:
http://www.gnu.org/software/libc/manual/html_node/Formatted-Output-Functions.html#Formatted-Output-Functions
Есть ссылка на POSIX, а вот что такое *template, это то, что описано под прототипом функции? или по соглашению некоего стандарта?
т.е. написано, что указатель на шаблон идёт из stdout, т.е. нужно переходить к stdout,- "расписывать"? Или можно посмотреть где-то список что обозначают таким образом?
Спасибо

Cообщение объединено 09 июня 2015, 23:22:35

Предположу, что поможет два источника:
Открыть содержимое (спойлер)
Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802

mrgoodvin

Прототипы используются для компилятора, что бы не было ошибок компиляции до использования функции, т.к. реализация функции может находится в другом месте/файле. Более того, реализация может быть представлена во многих вариантах (например для различных ОС). Поэтому, можно воспользоваться прототипом, а конкретная реализация будет известна уже при компиляции. В примере, прототипы вынесены в отдельный файл stdio.h, и реализация тоже где-то находится (скорее всего в файле с расширением "с"). Не смотря на то, что в примере ссылаются именно на то, что функция с переменным количеством параметров -  это нормальная практика, отделать определение от реализации. Суть функции, для примера prinf - вывести в поток stdout переменное количество аргументов, согласно формату шаблонной строки (первый параметр - const char *). К примеру printf("int k=%d", 12); ==> int k=12. Формат строки можно найти или же в stdio.h или же в реализации, а так же в документации, так как это дело документировано.

Цитата: Utility от 09 июня 2015, 20:37:03Прототип состоит из функции типов и аргументов.
Не совсем верная фраза. Скорее включает ее название и сигнатуру функции, что в свою очередь включает: возвращаемый тип, а также типы параметров функции.

Utility

В целом:
Открыть содержимое (спойлер)

http://users.ece.utexas.edu/~adnan/c-refcard.pdf - 2 стр. "шпарналка"
http://dfe.petrsu.ru/koi/posob/c/c.htm#g1.2 - более или менее адекватный учебник
http://pubs.opengroup.org/onlinepubs/9699919799/ - IEEE Std 1003.1, 2013 Edition
[свернуть]
Спасибо за ответы
Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802

smallNix

Добавлю, что разделение прототипа и реализации имеет ещё и чисто меркантильную цель (языки придумали империалисты  ;D ). Я пишу модуль, модуль закрытый и мне за него платят (распространяю как библиотеку), но, что бы её подключить мне нужно передать конечному пользователю прототипы, что бы он мог пользоваться моей библиотекой. А реализация остаётся скрытой :)
Кроме того такой трюк в С++ позволяет использовать динамическое связывание: т.е. при компиляции проекта имеется прототип, а реальная реализация вызывается при выполнении обращения.
Кто-то же должен что-то делать...

Utility

Цитата: smallNix от 12 июня 2015, 21:53:34
Добавлю, что разделение прототипа и реализации имеет ещё и чисто меркантильную цель (языки придумали империалисты  ;D ). Я пишу модуль, модуль закрытый и мне за него платят (распространяю как библиотеку), но, что бы её подключить мне нужно передать конечному пользователю прототипы, что бы он мог пользоваться моей библиотекой. А реализация остаётся скрытой :)
Кроме того такой трюк в С++ позволяет использовать динамическое связывание: т.е. при компиляции проекта имеется прототип, а реальная реализация вызывается при выполнении обращения.
Вопрос в цене кода, деассемблирование никто не отменял)
Пришёл к выводу, что С знать необходимо., но только и только Си использовать трудно. Посему пиши на чём считаешь удобным и правильным, хотя опять же упирается в цену разработки.
В общем, картину нарисовал, но приложить к изучению не могу. Ну не мое)
Спасибо
Стационар = MB: ASRock N68-gs4 FX R2.0 ; CPU: Athlon II x3 460 => Phenom B60; RAM: 2x Kingston KVR1333D3N9/4G; VGA: zotac gt630 4G
Ноутбук = ASUS x55a = MB: chipset HM70; CPU: Celeron B820; RAM: 2G: VGA: intel3000; audio VT1802