Dubov 0 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Хочется писать красивый и правильный код. Сейчас активно использую глобальные переменные и типа, если надо чтобы один модуль записывал данные, а другой их читал, то объявляю буфер как extern buf[256]; Вобщем понимаю что не комильфо всё это. Но иные варианты сами в голову не приходят, прошу помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба extern buf[256]; Сначала надо определиться, что именно здесь некрасиво и неправильно. Я, например, не вижу проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Сначала надо определиться, что именно здесь некрасиво и неправильно. Я, например, не вижу проблем. проблема в том, что буфер объявлен как глобальный в одном модуле proc.c, а в другом модуле main.c происходит его чтение, и там он объявлен как extern buf ну и собственно глобальные переменные - это не правильно. Разве нет? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба ну и собственно глобальные переменные - это не правильно. Разве нет? :rolleyes: Нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Swup 0 18 апреля, 2014 Опубликовано 18 апреля, 2014 (изменено) · Жалоба Вы ведь еще можете его передавать свой массив, как аргумент в функцию. Точнее не сам массив, а указатель на него. (Хотя инкапсуляцией тут и не пахнет) И я тоже не вижу ничего плохого в глобальных переменных, если они подходят к контексту. Изменено 18 апреля, 2014 пользователем Swup Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
insane_person 0 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Это увеличивает связность кода и соответственно усложняет его понимание. Как по мне так лучше в одном файле обьявить static array. И написать функции работы с ним (чтение и запись), которые будут видны в других файлах. Так гораздо удобнее отлавливать баги связанные с массивом, и проще понять где было произведено чтение или модификация массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Хочется писать красивый и правильный код. Сейчас активно использую глобальные переменные и типа, если надо чтобы один модуль записывал данные, а другой их читал, то объявляю буфер как extern buf[256]; Если надо красиво и правильно, но все объявления extern-объектов следует делать в отдельном хидере. Например, в global.h куда вписать все extern-определения. А чтобы и сами глобальные объекты не расползлись по разным модулям, то их желательно тоже поместить в отдельную корзину. Например, собрать их всех в модуле global.c или завести себе правило объявлять глобальные переменные только в модуле main.c (тогда и global.h можно обозвать main.h). А в самих сишных модулях слово extern никогда (!) не должно встречаться, а допустимо лишь включать #include "global.h" или #include "main.h" Тогда уж вы точно избежите любых ошибок, связанных с недоопределением глобальных переменных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Если надо красиво и правильно, но все объявления extern-объектов следует делать в отдельном хидере. Например, в global.h куда вписать все extern-определения. Ага. Свалим все в одну кучу, сделаем одну большую тарелку с макаронами, в которой станет почти невозможно отделить мух от котлет. Афигенно красиво. И настолько же правильно. :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Ага. Свалим все в одну кучу, сделаем одну большую тарелку с макаронами, в которой станет почти невозможно отделить мух от котлет. Афигенно красиво. И настолько же правильно. :cranky: Именно так. Определения, которые используются более чем одним модулем, должны не повторяться в каждом модуле, а быть однократно определены в хидере. Именно для этой цели хидеры изобрели - чтобы обеспечивать единообразие определений во всех модулях программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tiro 0 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Если надо красиво и правильно, но все объявления extern-объектов следует делать в отдельном хидере. А чтобы и сами глобальные объекты не расползлись по разным модулям, то их желательно тоже поместить в отдельную корзину. Например, собрать их всех в модуле global.c Упаси Боже так делать :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 апреля, 2014 Опубликовано 18 апреля, 2014 · Жалоба Именно так. Определения, которые используются более чем одним модулем, должны не повторяться в каждом модуле, а быть однократно определены в хидере.А вот и нет. Во-первых не определения, а объявления. А во-вторых переменные модуля А и его функции, которые используются другими модулями, должны быть объявлены в его заголовочном файле A.h и именно этот заголовочный файл должен включаться в тот и только в тот исходник/заголовочный файл, где эти объявления используются. А валить все в одну кучу, в один глобальный файл - это кошмар для сопровождения проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 19 апреля, 2014 Опубликовано 19 апреля, 2014 · Жалоба А вот и нет. Во-первых не определения, а объявления. Ну, путь объявления. :) А во-вторых переменные модуля А и его функции, которые используются другими модулями, должны быть объявлены в его заголовочном файле A.h и именно этот заголовочный файл должен включаться в тот и только в тот исходник/заголовочный файл, где эти объявления используются. А валить все в одну кучу, в один глобальный файл - это кошмар для сопровождения проекта. A.h это само собой. Ничто не мешает каждому модулю иметь свой хидер, в котором объявлять те функции, которые в нем определяются. А хидер global.h подключается дополнительно. Ведь и без того одним хидер-файлом не обойдешься. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 17 19 апреля, 2014 Опубликовано 19 апреля, 2014 · Жалоба Хочется писать красивый и правильный код. Используйте структуры. Возьмите себе за правило, что любая глобальная переменная должна быть частью какой-то структуры, а у структур должны быть короткие и осмысленные имена, чтобы по имени легко можно было понять, в каком модуле эта структура определена и в основном используется. Не используйте глобальные переменные, не входящие в структуры, используйте такие переменные только локально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 19 апреля, 2014 Опубликовано 19 апреля, 2014 · Жалоба Я тоже без особой нужды ничего не открываю. Доступ извне к массиву, объявленному в модуле - через функцию. Это не засоряет пространство имен внутри модуля. Хоть 100500 одинаково названных queue, но определенных в разных модулях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 17 19 апреля, 2014 Опубликовано 19 апреля, 2014 · Жалоба Доступ извне к массиву, объявленному в модуле - через функцию. Это не засоряет пространство имен внутри модуля. Хоть 100500 одинаково названных queue, но определенных в разных модулях. Такой подход имеет право на существование, однако у него все же есть два недостатка: - Пространство имен функций все-таки засоряется. Не получится иметь 100500 функций init(); - На вызов функции и возврат из нее тратится время и память кода. Напрямую с переменной работать эффективнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться