#42. Прототипы функций | Язык C для начинающих

Поделиться
HTML-код
  • Опубликовано: 24 май 2023
  • Практический курс по C/C++: stepik.org/course/193691/
    Телеграм-канал: t.me/java_and_c
    Инфо-сайт: proproprogs.ru/c_base
    Что такое прототипы функций и зачем они нужны. Пример организации программы в нескольких модулях и ее компиляция.

Комментарии • 27

  • @vladimirastrelin1719
    @vladimirastrelin1719 Год назад +4

    Кладезь знаний..Спасибо за урок !

  • @user-wm1rg2ik2r
    @user-wm1rg2ik2r 10 месяцев назад +2

    Как всегда на самом высшем уровне, благодарю Вас!

  • @AlexRootx
    @AlexRootx Год назад +2

    На высоте, как обычно, лайк за работу!!!

  • @Ordinary_man2049
    @Ordinary_man2049 3 месяца назад +1

    Сергей, спасибо за Ваши уроки! Мне кажется, стоило сказать, что декларирование функций в начале позволяет нам объявлять функции после функции main. Это может быть удобно, когда надо реализовать несколько функций, ради которых не хочется создавать отдельный файл, но при этом не хочется, чтобы эти функции отсвечивали перед main.

  • @andredru4278
    @andredru4278 6 месяцев назад +1

    Спасибо. Огонь!

  • @userqh67vey6
    @userqh67vey6 10 месяцев назад +2

    gcc умеет подключать .c файлы в инклудах. Visual Studio наоборот ругается на такое, но умеет сама находить исходники в правильной папке по имени h файла.
    Другое дело, когда проект кроссплатформенный - там с помощью make файла прописываются build-ы из разных библиотеками. Или можно использовать при тестировании - поставщики данных подменять заглушками.

  • @Eduard-ne2ff
    @Eduard-ne2ff Год назад +1

    Thanks!

  • @vladimirastrelin1719
    @vladimirastrelin1719 Год назад +2

    В main.c указан #include "my_header.h" В этом "my_header.h" указаны прототипы функций, которые реализованы непосредственно в "func.c" Интересно было бы узнать поподробнее как происходит "магия" на этапе линковки..как линкер воедино собирает все части объектных файлов, которые производит компилятор.

    • @selfedu_rus
      @selfedu_rus  Год назад +2

      Очень просто. До компилятора h-файлы не доходят, их содержимое вставляется в c-файлы. Поэтому если мы сразу все пропишем в c-файле, то разницы для компилятора никакой!

    • @vladimirastrelin1719
      @vladimirastrelin1719 Год назад +1

      @@selfedu_rus понял. Спасибо большое за пояснение

  • @vaok3
    @vaok3 Год назад +1

    Сергей, по JavaScript не планируете курс?

    • @selfedu_rus
      @selfedu_rus  Год назад

      Уже есть на этом канале

  • @user-xm5zl9up4r
    @user-xm5zl9up4r 5 месяцев назад +1

    Сергей, скажите, почему в файле с условной компиляцией пишется FUNC H, если заголовочный файл называется func. h?
    И как компилятор тогда понимает, что это именно этот файл? Спасибо

    • @selfedu_rus
      @selfedu_rus  5 месяцев назад +1

      вместо FUNC H можно написать любое другое имя, пишут название файла, чтобы избежать случайного дублирования имен

    • @user-xm5zl9up4r
      @user-xm5zl9up4r 5 месяцев назад

      @@selfedu_rus спасибо

  • @pewpewpew8613
    @pewpewpew8613 7 месяцев назад +1

    В других языках модули имеют свою область видимости и позволяют избегать конфликтов имен, а тут получается, что это просто файл, который подставляется препроцессором в код без всякой изоляции и надо самим следить, что бы в двух подключаемых файлах не было функций с одинаковым названием. Как будто это вообще никакие не модули.

    • @olegkomlev
      @olegkomlev 5 месяцев назад

      Совершенно верно. Просто препроцессор соединяет вместе тексты из всех файлов, поэтому необходим механизм #ifndef/#define. В некоторых современных компиляторах можно вместо этого писать #pragma once, но это более современный вариант, и он не везде поддерживается. А древний механизм #ifndef/#define - везде.
      Кроме того, среды программирования, такие как Visual Studio, отслеживают какие именно файлы с исходным текстом изменились (и даже, какие части файла изменились), чтобы не перекомпилировать всё полностью. Но, в любом случае, механизм модулей, например, в Delphi\Modula\Oberon развит лучше, там это больше, чем соединение текстов.

    • @Ordinary_man2049
      @Ordinary_man2049 3 месяца назад

      Для этого при инициализации функций и переменных можно использовать ключевое слово static

    • @pewpewpew8613
      @pewpewpew8613 3 месяца назад

      @@Ordinary_man2049 статик сделает функцию доступной только в переделах одного файла. Так что это скорее не про модульность, а что-то вроде модификатора доступа.

  • @user-ol4vq8ig3o
    @user-ol4vq8ig3o 7 месяцев назад +1

    Почему когда мы записываем функцию, а точнее заголовок ставим фигурную скобку, но когда пишем прототип она сменяется на точку с запятой?

    • @selfedu_rus
      @selfedu_rus  7 месяцев назад +1

      объявление функции состоит из двух частей: заголовка и тела функции (то, что в фигурных скобках, включая их); при определении прототипа записывается только заголовок, поэтому после него сразу ставится точка с запятой (требование синтаксиса), а тело не прописывается

    • @user-ol4vq8ig3o
      @user-ol4vq8ig3o 7 месяцев назад

      @@selfedu_rus Спасибо большое за ваш труд!!!

  • @donfedor007
    @donfedor007 Год назад +1

    Добрый день! Как не запутаться в каком файле лежит, та или иная функция. Импортов как в питоне нет. Просто при компиляции прописывается несколько файлов. Не совсем понятно

    • @selfedu_rus
      @selfedu_rus  Год назад +1

      По названиям файлов (им следует давать осмысленные имена). Больше никак + документация по собственному проекту + комментарии в самих файлах.

    • @donfedor007
      @donfedor007 Год назад

      @@selfedu_rus спасибо

  • @Bezdarnyi_Master
    @Bezdarnyi_Master 4 месяца назад +1

    Зачем создавать отдельные файлы под реализацию и под прототипы? почему нельзя в одном файле прописать реализацию и подключить его в главном файле? Для чего вообще прототипы нужны?! Препроцессор подставит полностью заголовок и описание функции перед функцией main из одного файла... получится тоже самое что на прошлых уроках делали. Не?!

  • @renigat_tv9051
    @renigat_tv9051 10 месяцев назад +1

    Давайте лаки до 100 накрутим !