#42. Прототипы функций | Язык C для начинающих
HTML-код
- Опубликовано: 24 май 2023
- Практический курс по C/C++: stepik.org/course/193691/
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru/c_base
Что такое прототипы функций и зачем они нужны. Пример организации программы в нескольких модулях и ее компиляция.
Кладезь знаний..Спасибо за урок !
Как всегда на самом высшем уровне, благодарю Вас!
На высоте, как обычно, лайк за работу!!!
Сергей, спасибо за Ваши уроки! Мне кажется, стоило сказать, что декларирование функций в начале позволяет нам объявлять функции после функции main. Это может быть удобно, когда надо реализовать несколько функций, ради которых не хочется создавать отдельный файл, но при этом не хочется, чтобы эти функции отсвечивали перед main.
Спасибо. Огонь!
gcc умеет подключать .c файлы в инклудах. Visual Studio наоборот ругается на такое, но умеет сама находить исходники в правильной папке по имени h файла.
Другое дело, когда проект кроссплатформенный - там с помощью make файла прописываются build-ы из разных библиотеками. Или можно использовать при тестировании - поставщики данных подменять заглушками.
Thanks!
В main.c указан #include "my_header.h" В этом "my_header.h" указаны прототипы функций, которые реализованы непосредственно в "func.c" Интересно было бы узнать поподробнее как происходит "магия" на этапе линковки..как линкер воедино собирает все части объектных файлов, которые производит компилятор.
Очень просто. До компилятора h-файлы не доходят, их содержимое вставляется в c-файлы. Поэтому если мы сразу все пропишем в c-файле, то разницы для компилятора никакой!
@@selfedu_rus понял. Спасибо большое за пояснение
Сергей, по JavaScript не планируете курс?
Уже есть на этом канале
Сергей, скажите, почему в файле с условной компиляцией пишется FUNC H, если заголовочный файл называется func. h?
И как компилятор тогда понимает, что это именно этот файл? Спасибо
вместо FUNC H можно написать любое другое имя, пишут название файла, чтобы избежать случайного дублирования имен
@@selfedu_rus спасибо
В других языках модули имеют свою область видимости и позволяют избегать конфликтов имен, а тут получается, что это просто файл, который подставляется препроцессором в код без всякой изоляции и надо самим следить, что бы в двух подключаемых файлах не было функций с одинаковым названием. Как будто это вообще никакие не модули.
Совершенно верно. Просто препроцессор соединяет вместе тексты из всех файлов, поэтому необходим механизм #ifndef/#define. В некоторых современных компиляторах можно вместо этого писать #pragma once, но это более современный вариант, и он не везде поддерживается. А древний механизм #ifndef/#define - везде.
Кроме того, среды программирования, такие как Visual Studio, отслеживают какие именно файлы с исходным текстом изменились (и даже, какие части файла изменились), чтобы не перекомпилировать всё полностью. Но, в любом случае, механизм модулей, например, в Delphi\Modula\Oberon развит лучше, там это больше, чем соединение текстов.
Для этого при инициализации функций и переменных можно использовать ключевое слово static
@@Ordinary_man2049 статик сделает функцию доступной только в переделах одного файла. Так что это скорее не про модульность, а что-то вроде модификатора доступа.
Почему когда мы записываем функцию, а точнее заголовок ставим фигурную скобку, но когда пишем прототип она сменяется на точку с запятой?
объявление функции состоит из двух частей: заголовка и тела функции (то, что в фигурных скобках, включая их); при определении прототипа записывается только заголовок, поэтому после него сразу ставится точка с запятой (требование синтаксиса), а тело не прописывается
@@selfedu_rus Спасибо большое за ваш труд!!!
Добрый день! Как не запутаться в каком файле лежит, та или иная функция. Импортов как в питоне нет. Просто при компиляции прописывается несколько файлов. Не совсем понятно
По названиям файлов (им следует давать осмысленные имена). Больше никак + документация по собственному проекту + комментарии в самих файлах.
@@selfedu_rus спасибо
Зачем создавать отдельные файлы под реализацию и под прототипы? почему нельзя в одном файле прописать реализацию и подключить его в главном файле? Для чего вообще прототипы нужны?! Препроцессор подставит полностью заголовок и описание функции перед функцией main из одного файла... получится тоже самое что на прошлых уроках делали. Не?!
Давайте лаки до 100 накрутим !