Сергей, спасибо за Ваши уроки! Мне кажется, стоило сказать, что декларирование функций в начале позволяет нам объявлять функции после функции main. Это может быть удобно, когда надо реализовать несколько функций, ради которых не хочется создавать отдельный файл, но при этом не хочется, чтобы эти функции отсвечивали перед main.
gcc умеет подключать .c файлы в инклудах. Visual Studio наоборот ругается на такое, но умеет сама находить исходники в правильной папке по имени h файла. Другое дело, когда проект кроссплатформенный - там с помощью make файла прописываются build-ы из разных библиотеками. Или можно использовать при тестировании - поставщики данных подменять заглушками.
Сергей, скажите, почему в файле с условной компиляцией пишется FUNC H, если заголовочный файл называется func. h? И как компилятор тогда понимает, что это именно этот файл? Спасибо
Добрый день! Как не запутаться в каком файле лежит, та или иная функция. Импортов как в питоне нет. Просто при компиляции прописывается несколько файлов. Не совсем понятно
В других языках модули имеют свою область видимости и позволяют избегать конфликтов имен, а тут получается, что это просто файл, который подставляется препроцессором в код без всякой изоляции и надо самим следить, что бы в двух подключаемых файлах не было функций с одинаковым названием. Как будто это вообще никакие не модули.
Совершенно верно. Просто препроцессор соединяет вместе тексты из всех файлов, поэтому необходим механизм #ifndef/#define. В некоторых современных компиляторах можно вместо этого писать #pragma once, но это более современный вариант, и он не везде поддерживается. А древний механизм #ifndef/#define - везде. Кроме того, среды программирования, такие как Visual Studio, отслеживают какие именно файлы с исходным текстом изменились (и даже, какие части файла изменились), чтобы не перекомпилировать всё полностью. Но, в любом случае, механизм модулей, например, в Delphi\Modula\Oberon развит лучше, там это больше, чем соединение текстов.
@@Ordinary_man2049 статик сделает функцию доступной только в переделах одного файла. Так что это скорее не про модульность, а что-то вроде модификатора доступа.
объявление функции состоит из двух частей: заголовка и тела функции (то, что в фигурных скобках, включая их); при определении прототипа записывается только заголовок, поэтому после него сразу ставится точка с запятой (требование синтаксиса), а тело не прописывается
Зачем создавать отдельные файлы под реализацию и под прототипы? почему нельзя в одном файле прописать реализацию и подключить его в главном файле? Для чего вообще прототипы нужны?! Препроцессор подставит полностью заголовок и описание функции перед функцией main из одного файла... получится тоже самое что на прошлых уроках делали. Не?!
Я не профи, но кое что расскажу когда я писал телеграмм бота на python я писал все в одном файле у меня получился код на 1500+ кода. И какая же эта была ошибка. Если мне нужно было найти функцию где я подключался к базам данных мне пришлось листать и искать функцию, ну или же просто ctrl+f и в поиске ввести имя функции, но каждый раз это делать что бы исправит что-то в функция не не. Поэтому я решил разбить код на файлы для Баз данных я сделал отдельный файл с функциями и для других вещей тоже отдельные файлы и так мне стало гораздо гораздо легче. Но в Си я тоже не понимаю зачем отдельно прописывать прототипы и реализацию, поч нельзя в отдельном заголовочном файле прописать нужные функции с их реализациями.
Как всегда на самом высшем уровне, благодарю Вас!
На высоте, как обычно, лайк за работу!!!
Сергей, спасибо за Ваши уроки! Мне кажется, стоило сказать, что декларирование функций в начале позволяет нам объявлять функции после функции main. Это может быть удобно, когда надо реализовать несколько функций, ради которых не хочется создавать отдельный файл, но при этом не хочется, чтобы эти функции отсвечивали перед main.
gcc умеет подключать .c файлы в инклудах. Visual Studio наоборот ругается на такое, но умеет сама находить исходники в правильной папке по имени h файла.
Другое дело, когда проект кроссплатформенный - там с помощью make файла прописываются build-ы из разных библиотеками. Или можно использовать при тестировании - поставщики данных подменять заглушками.
Спасибо. Огонь!
Сергей, скажите, почему в файле с условной компиляцией пишется FUNC H, если заголовочный файл называется func. h?
И как компилятор тогда понимает, что это именно этот файл? Спасибо
вместо FUNC H можно написать любое другое имя, пишут название файла, чтобы избежать случайного дублирования имен
@@selfedu_rus спасибо
Сергей, по JavaScript не планируете курс?
Уже есть на этом канале
Добрый день! Как не запутаться в каком файле лежит, та или иная функция. Импортов как в питоне нет. Просто при компиляции прописывается несколько файлов. Не совсем понятно
По названиям файлов (им следует давать осмысленные имена). Больше никак + документация по собственному проекту + комментарии в самих файлах.
@@selfedu_rus спасибо
В других языках модули имеют свою область видимости и позволяют избегать конфликтов имен, а тут получается, что это просто файл, который подставляется препроцессором в код без всякой изоляции и надо самим следить, что бы в двух подключаемых файлах не было функций с одинаковым названием. Как будто это вообще никакие не модули.
Совершенно верно. Просто препроцессор соединяет вместе тексты из всех файлов, поэтому необходим механизм #ifndef/#define. В некоторых современных компиляторах можно вместо этого писать #pragma once, но это более современный вариант, и он не везде поддерживается. А древний механизм #ifndef/#define - везде.
Кроме того, среды программирования, такие как Visual Studio, отслеживают какие именно файлы с исходным текстом изменились (и даже, какие части файла изменились), чтобы не перекомпилировать всё полностью. Но, в любом случае, механизм модулей, например, в Delphi\Modula\Oberon развит лучше, там это больше, чем соединение текстов.
Для этого при инициализации функций и переменных можно использовать ключевое слово static
@@Ordinary_man2049 статик сделает функцию доступной только в переделах одного файла. Так что это скорее не про модульность, а что-то вроде модификатора доступа.
Почему когда мы записываем функцию, а точнее заголовок ставим фигурную скобку, но когда пишем прототип она сменяется на точку с запятой?
объявление функции состоит из двух частей: заголовка и тела функции (то, что в фигурных скобках, включая их); при определении прототипа записывается только заголовок, поэтому после него сразу ставится точка с запятой (требование синтаксиса), а тело не прописывается
@@selfedu_rus Спасибо большое за ваш труд!!!
Зачем создавать отдельные файлы под реализацию и под прототипы? почему нельзя в одном файле прописать реализацию и подключить его в главном файле? Для чего вообще прототипы нужны?! Препроцессор подставит полностью заголовок и описание функции перед функцией main из одного файла... получится тоже самое что на прошлых уроках делали. Не?!
Я не профи, но кое что расскажу когда я писал телеграмм бота на python я писал все в одном файле у меня получился код на 1500+ кода. И какая же эта была ошибка. Если мне нужно было найти функцию где я подключался к базам данных мне пришлось листать и искать функцию, ну или же просто ctrl+f и в поиске ввести имя функции, но каждый раз это делать что бы исправит что-то в функция не не. Поэтому я решил разбить код на файлы для Баз данных я сделал отдельный файл с функциями и для других вещей тоже отдельные файлы и так мне стало гораздо гораздо легче. Но в Си я тоже не понимаю зачем отдельно прописывать прототипы и реализацию, поч нельзя в отдельном заголовочном файле прописать нужные функции с их реализациями.
Давайте лаки до 100 накрутим !