Перейти к содержанию
    

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

 

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

extern buf[256];

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

extern buf[256];

Сначала надо определиться, что именно здесь некрасиво и неправильно. Я, например, не вижу проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сначала надо определиться, что именно здесь некрасиво и неправильно. Я, например, не вижу проблем.

проблема в том, что буфер объявлен как глобальный в одном модуле proc.c, а в другом модуле main.c происходит его чтение, и там он объявлен как extern buf

 

ну и собственно глобальные переменные - это не правильно.

 

Разве нет? :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну и собственно глобальные переменные - это не правильно.

 

Разве нет? :rolleyes:

Нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы ведь еще можете его передавать свой массив, как аргумент в функцию. Точнее не сам массив, а указатель на него. (Хотя инкапсуляцией тут и не пахнет)

 

И я тоже не вижу ничего плохого в глобальных переменных, если они подходят к контексту.

Изменено пользователем Swup

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это увеличивает связность кода и соответственно усложняет его понимание.

Как по мне так лучше в одном файле обьявить static array.

И написать функции работы с ним (чтение и запись), которые будут видны в других файлах.

Так гораздо удобнее отлавливать баги связанные с массивом, и проще понять где было произведено чтение или модификация массива.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

extern buf[256];

 

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

Например, в

global.h

куда вписать все extern-определения.

 

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

Например, собрать их всех в модуле

global.c

или завести себе правило объявлять глобальные переменные только в модуле main.c

(тогда и global.h можно обозвать main.h).

 

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

#include "global.h"

или

#include "main.h"

 

Тогда уж вы точно избежите любых ошибок, связанных с недоопределением глобальных переменных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Например, в

global.h

куда вписать все extern-определения.

Ага. Свалим все в одну кучу, сделаем одну большую тарелку с макаронами, в которой станет почти невозможно отделить мух от котлет. Афигенно красиво. И настолько же правильно. :cranky:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага. Свалим все в одну кучу, сделаем одну большую тарелку с макаронами, в которой станет почти невозможно отделить мух от котлет. Афигенно красиво. И настолько же правильно. :cranky:

 

Именно так. Определения, которые используются более чем одним модулем, должны не повторяться в каждом модуле, а быть однократно определены в хидере. Именно для этой цели хидеры изобрели - чтобы обеспечивать единообразие определений во всех модулях программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Например, собрать их всех в модуле

global.c

Упаси Боже так делать :))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Именно так. Определения, которые используются более чем одним модулем, должны не повторяться в каждом модуле, а быть однократно определены в хидере.
А вот и нет. Во-первых не определения, а объявления. А во-вторых переменные модуля А и его функции, которые используются другими модулями, должны быть объявлены в его заголовочном файле A.h и именно этот заголовочный файл должен включаться в тот и только в тот исходник/заголовочный файл, где эти объявления используются. А валить все в одну кучу, в один глобальный файл - это кошмар для сопровождения проекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот и нет. Во-первых не определения, а объявления.

Ну, путь объявления. :)

 

А во-вторых переменные модуля А и его функции, которые используются другими модулями, должны быть объявлены в его заголовочном файле A.h и именно этот заголовочный файл должен включаться в тот и только в тот исходник/заголовочный файл, где эти объявления используются. А валить все в одну кучу, в один глобальный файл - это кошмар для сопровождения проекта.

A.h это само собой. Ничто не мешает каждому модулю иметь свой хидер, в котором объявлять те функции, которые в нем определяются. А хидер global.h подключается дополнительно. Ведь и без того одним хидер-файлом не обойдешься.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже без особой нужды ничего не открываю. Доступ извне к массиву, объявленному в модуле - через функцию. Это не засоряет пространство имен внутри модуля.

Хоть 100500 одинаково названных queue, но определенных в разных модулях.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доступ извне к массиву, объявленному в модуле - через функцию. Это не засоряет пространство имен внутри модуля. Хоть 100500 одинаково названных queue, но определенных в разных модулях.

Такой подход имеет право на существование, однако у него все же есть два недостатка:

- Пространство имен функций все-таки засоряется. Не получится иметь 100500 функций init();

- На вызов функции и возврат из нее тратится время и память кода. Напрямую с переменной работать эффективнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...