-
- Есть два
стулафайла task1.h и task1.c. В каком сам писать станешь, в каком extern'ы объявишь? - RxTx(25.04.2024 08:32) - Почитайте со стр.93 Бoмж(1 знак., 23.04.2024 10:51, ссылка)
- Нет! Читать непременно от корки до корки. Священное писание же. - SciFi(23.04.2024 10:53)
- А корки при этом грызть - они гранитные. - Kpoк(24.04.2024 08:15)
- Не, они не сликшом сложные. Довольно мягкие, зубы легко справятся. - Nikolay_Po(24.04.2024 09:26)
- А корки при этом грызть - они гранитные. - Kpoк(24.04.2024 08:15)
- Нет! Читать непременно от корки до корки. Священное писание же. - SciFi(23.04.2024 10:53)
- Так в любой STMовской либе из вашего любимого куба можно подсмотреть: il-2(263 знак., 23.04.2024 07:32)
- Объявление функции не требует модификатора extern и будет одинаково
как для файла где она определена, так и для всех остальных файлов.
Таким образом, заголовочный файл получается одинаков для всех.
Разница будет когда начнёте глобальные переменные наружу светить.
Тогда в tadk.c дефайните TASK_C и в заголовочном файле в
зависимости определена ли она делаете extern или нет. - VladislavS.(23.04.2024 07:24)
- Для глобальных переменных допускается иметь в одной единице
трансляции ( т.е. *.с файле) и определение и объявление со словом extern, это не будет ошибкой, если они не противоречат
друг другу. - ЫЫyкпy(23.04.2024 08:29)
- Чтобы не было противоречия, определение и объявление делать в одном
месте (в заголовочном файле), а для этого нужно определять куда он
подключен. Ну это моя практика, можно, конечно, всё раскидать по
файлам и надеяться что совпадёт. - VladislavS.(24.04.2024 07:19)
- По-моему, нельзя (ну уж по крайней мере не следует) делать
определение в заголовочном файле. Всё, что приводит к выделению
памяти, не важно, переменных или программы, должно определяться в
*.c. А в заголовочных файлах должны быть лишь объявления, не
обязывающие выделять память. Nikolay_Po(74 знак., 24.04.2024 09:29)
- Как то раз я сделал простой тест для Linux Tyмблep(1733 знак., 25.04.2024 18:13)
- Достаточно просто заифдефить чтобы заголовочный файл только в одном
с-файле выдал без extern. - VladislavS.(24.04.2024 22:39)
- Фу, как грубо :-) Хотя я тоже такими приемчиками пользуюсь, только
для файлов с различными конфигами. - il-2(25.04.2024 07:39)
- очень даже нормуль для глобальных переменных(а вот они глобальные
переменные - это фу как грубо :) У мну с незапамятных времен С89
макрос для этого есть abivan(219 знак., 25.04.2024 09:07)
- На что не пойдёшь, лишь бы плюсами не пользоваться. - VladislavS.(25.04.2024 16:05)
- Такое оправдывает только необходимость поддержки нескольких
конфигураций... И то, мне непонятно, где это полезно. - Nikolay_Po(25.04.2024 09:17)
- это позволяет совместить определение и описание в одном месте,
чтобы не писать дважды. Смысл писать дважды, если можно один раз. abivan(41 знак., 25.04.2024 09:37, картинка)
- Самое страшное слово - extern Tyмблep(440 знак., 27.04.2024 17:30)
- С моими ключами компиляции, такое точно не пройдёт. Будет
предупреждение-ошибка на третьем. - Nikolay_Po(27.04.2024 22:06)
- Да. Скажэт, что множэственное переопределение. Покажэт где текущее и где предыдущее. Но да, по возможности, определяю глобальных в одном месте. - mse homjak(29.04.2024 14:50)
- Потенциально неприятная ситуация. Tyмблep(692 знак., 29.04.2024 14:17)
- С моими ключами компиляции, такое точно не пройдёт. Будет
предупреждение-ошибка на третьем. - Nikolay_Po(27.04.2024 22:06)
- Ага, примочка для облегчения размножения глобальных переменных? Пожизненный эцих с гвоздями! Правильные пацаны делают структуру. А у меня вообще привычка делать static переменные в модулях и функции для доступа к ним. Не люблю глобальные переменные. - SciFi(25.04.2024 09:39)
- Ну, это имеет смысл, если всё в одном файле, а не в паре. Например,
если вся функция, включая её исполняемый код - в заголовочном файле
и файла .c вообще нет. Если есть два места, то несложно написать
дважды. - Nikolay_Po(25.04.2024 09:38)
- не сложно, но зачем? Вопрос религии и вкусовщины. А в каком файле
написать определение, если переменная равноиспользуется в
нескольких файлах. В любом? А почему в этом, а не в этом? Сразу
возникает неопределенность. - abivan(25.04.2024 09:49)
- Если прямо совсем равноиспользуемая и её используют многие модули, многие файлы, то я помещу эту переменную в "control.c" или в "system.c" или даже в "main.c". В зависимости от того, чей заголовочный файл будет разумно и достаточно включать в использующий переменную код. - Nikolay_Po(25.04.2024 10:12)
- не сложно, но зачем? Вопрос религии и вкусовщины. А в каком файле
написать определение, если переменная равноиспользуется в
нескольких файлах. В любом? А почему в этом, а не в этом? Сразу
возникает неопределенность. - abivan(25.04.2024 09:49)
- Самое страшное слово - extern Tyмблep(440 знак., 27.04.2024 17:30)
- это позволяет совместить определение и описание в одном месте,
чтобы не писать дважды. Смысл писать дважды, если можно один раз. abivan(41 знак., 25.04.2024 09:37, картинка)
- очень даже нормуль для глобальных переменных(а вот они глобальные
переменные - это фу как грубо :) У мну с незапамятных времен С89
макрос для этого есть abivan(219 знак., 25.04.2024 09:07)
- Фу, как грубо :-) Хотя я тоже такими приемчиками пользуюсь, только
для файлов с различными конфигами. - il-2(25.04.2024 07:39)
- ИМХО, современные компилеры не включают код функцыи, дажэ из "*.с",
если функция не задействована в программе. - mse homjak(24.04.2024 10:53)
- По-разному бывает. У того же GCC нужно правильные настройки сделать, чтобы так было. Бывает так, что юзверь недоумевает "а чего это он лишний код не выкинул?", а всё потому, что юзверь не научился правильно крутить настройки. - SciFi(24.04.2024 11:10)
- Это другое. Линкер, встретив в разных объектниках две одинаково
названные переменные или функции, будет ругаться, даже если эти
переменные ни где не используются и будут выкинуты. - AlexBi(24.04.2024 10:59)
- Я про то, что "выделение памяти". - mse homjak(24.04.2024 11:04)
- По-моему, нельзя (ну уж по крайней мере не следует) делать
определение в заголовочном файле. Всё, что приводит к выделению
памяти, не важно, переменных или программы, должно определяться в
*.c. А в заголовочных файлах должны быть лишь объявления, не
обязывающие выделять память. Nikolay_Po(74 знак., 24.04.2024 09:29)
- Даже полезно иметь их в общей единице трансляции для проверки
согласованности. - =AlexD=(23.04.2024 11:05)
- О, круто, спасибо всем! - Mty1(23.04.2024 18:18)
- Чтобы не было противоречия, определение и объявление делать в одном
месте (в заголовочном файле), а для этого нужно определять куда он
подключен. Ну это моя практика, можно, конечно, всё раскидать по
файлам и надеяться что совпадёт. - VladislavS.(24.04.2024 07:19)
- Почему для переменных должно быть что-то другое, за исключением явного указания extern? Т.е. чем не подходит запись в файле tash.h : extern int a; А в файле task.c : int a; - AlexBi(23.04.2024 08:25)
- Для глобальных переменных допускается иметь в одной единице
трансляции ( т.е. *.с файле) и определение и объявление со словом extern, это не будет ошибкой, если они не противоречат
друг другу. - ЫЫyкпy(23.04.2024 08:29)
- Путаница в терминологии. Описанные в с-файле функции, которые должны быть доступными всем, это не extern (внешние) а "публичные". Объявляются в h-файле и доступны через #include этого h-файла. Если функция используется только внутри модуля - это приватная функция, объявляется в с-файле, чтобы не забивать мозг другим модулям. "extern"-функция объявляется в с-файле, чтобы использовать чужую функцию не подключая соответствующий h-файл, или вообще, приватную. А не в хидере Idler(1 знак., 23.04.2024 07:06)
- Есть два