реклама на сайте
подробности

 
 
> инкапсуляция в С, как?
Dubov
сообщение Apr 18 2014, 12:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Хочется писать красивый и правильный код.

Сейчас активно использую глобальные переменные и типа, если надо чтобы один модуль записывал данные, а другой их читал, то объявляю буфер как
extern buf[256];

Вобщем понимаю что не комильфо всё это. Но иные варианты сами в голову не приходят, прошу помочь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Apr 18 2014, 16:33
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Dubov @ Apr 18 2014, 16:01) *
Хочется писать красивый и правильный код.
Сейчас активно использую глобальные переменные и типа, если надо чтобы один модуль записывал данные, а другой их читал, то объявляю буфер как
extern buf[256];


Если надо красиво и правильно, но все объявления extern-объектов следует делать в отдельном хидере.
Например, в
global.h
куда вписать все extern-определения.

А чтобы и сами глобальные объекты не расползлись по разным модулям, то их желательно тоже поместить в отдельную корзину.
Например, собрать их всех в модуле
global.c
или завести себе правило объявлять глобальные переменные только в модуле main.c
(тогда и global.h можно обозвать main.h).

А в самих сишных модулях слово extern никогда (!) не должно встречаться, а допустимо лишь включать
#include "global.h"
или
#include "main.h"

Тогда уж вы точно избежите любых ошибок, связанных с недоопределением глобальных переменных.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 18 2014, 18:54
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Xenia @ Apr 18 2014, 19:33) *
Если надо красиво и правильно, но все объявления extern-объектов следует делать в отдельном хидере.
Например, в
global.h
куда вписать все extern-определения.
Ага. Свалим все в одну кучу, сделаем одну большую тарелку с макаронами, в которой станет почти невозможно отделить мух от котлет. Афигенно красиво. И настолько же правильно. cranky.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Apr 18 2014, 22:13
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Сергей Борщ @ Apr 18 2014, 22:54) *
Ага. Свалим все в одну кучу, сделаем одну большую тарелку с макаронами, в которой станет почти невозможно отделить мух от котлет. Афигенно красиво. И настолько же правильно. cranky.gif


Именно так. Определения, которые используются более чем одним модулем, должны не повторяться в каждом модуле, а быть однократно определены в хидере. Именно для этой цели хидеры изобрели - чтобы обеспечивать единообразие определений во всех модулях программы.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 18 2014, 23:36
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Xenia @ Apr 19 2014, 01:13) *
Именно так. Определения, которые используются более чем одним модулем, должны не повторяться в каждом модуле, а быть однократно определены в хидере.
А вот и нет. Во-первых не определения, а объявления. А во-вторых переменные модуля А и его функции, которые используются другими модулями, должны быть объявлены в его заголовочном файле A.h и именно этот заголовочный файл должен включаться в тот и только в тот исходник/заголовочный файл, где эти объявления используются. А валить все в одну кучу, в один глобальный файл - это кошмар для сопровождения проекта.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dubov   инкапсуляция в С   Apr 18 2014, 12:01
- - aaarrr   Цитата(Dubov @ Apr 18 2014, 16:01) extern...   Apr 18 2014, 12:06
|- - Dubov   Цитата(aaarrr @ Apr 18 2014, 16:06) Снача...   Apr 18 2014, 12:17
|- - aaarrr   Цитата(Dubov @ Apr 18 2014, 16:17) ну и с...   Apr 18 2014, 12:21
- - Swup   Вы ведь еще можете его передавать свой массив, как...   Apr 18 2014, 12:31
- - insane_person   Это увеличивает связность кода и соответственно ус...   Apr 18 2014, 15:40
||- - Xenia   Цитата(Сергей Борщ @ Apr 19 2014, 03:36) ...   Apr 19 2014, 03:39
||- - Сергей Борщ   Цитата(Xenia @ Apr 19 2014, 06:39) А хиде...   Apr 19 2014, 07:31
|- - Tiro   Цитата(Xenia @ Apr 18 2014, 19:33) Если н...   Apr 18 2014, 22:25
- - =AK=   Цитата(Dubov @ Apr 18 2014, 21:31) Хочетс...   Apr 19 2014, 04:01
- - _Pasha   Я тоже без особой нужды ничего не открываю. Доступ...   Apr 19 2014, 04:05
|- - =AK=   Цитата(_Pasha @ Apr 19 2014, 13:35) Досту...   Apr 19 2014, 04:34
|- - _Pasha   Цитата(=AK= @ Apr 19 2014, 07:34) Такой п...   Apr 19 2014, 09:32
- - andrewlekar   ЦитатаЗачем, ну объясните мне, зачем делать эту об...   Apr 20 2014, 15:50
|- - Dubov   Цитата(andrewlekar @ Apr 20 2014, 19:50) ...   Apr 22 2014, 05:32
- - andrewlekar   Приложение может строиться разными способами. Ваша...   Apr 22 2014, 07:58
- - thodnev   Инкапсуляция является одним из подходов к ООП, а С...   May 8 2014, 16:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016