У меня есть предложение: использовать область действия.
Хорошо написанные программы на C редко нуждаются во многих глобальных переменных, а большинство глобальных переменных требуется для написания хорошо написанной программы C только одним или двумя файлами .c. Не имеет смысла использовать одни и те же глобальные переменные во всех файлах .c в большой программе, потому что тогда вы теряете преимущества information hiding и modularity. Ваша программа становится хрупкой и трудно меняющейся, потому что изменение одной части программы влияет на глобальные переменные и, таким образом, влияет на всю оставшуюся часть программы.
EDIT: Предложения по предотвращению глобальных переменных
делим код на модули, каждая из которых одна работа, чтобы сделать, а затем выполнить эту работу, не в зависимости от каких-либо глобальных переменных, видимых за пределами модуля. Обратите внимание, что это не всегда зависит от каких-либо глобальных переменных и действительно является предпочтительным. Кроме того, мне нравится предложение, указанное в ответе StackOverflow here.
Давайте рассмотрим быстрый пример деления программы на модули. Обычно программа, видимая пользователем, будет иметь некоторую логику пользовательского интерфейса, некоторую бизнес-логику и, возможно, оверлей подключения к базе данных. Каждая из этих вещей представляет как минимум один модуль, возможно, несколько. В качестве нашего примера давайте оставим базу данных и рассмотрим такую программу, как Unix wc
. Он читает файл, подсчитывает слова и печатает количество слов. Простой, не так ли? Ну, даже эта простая программа должна иметь один модуль для анализа аргументов командной строки и помещения этих аргументов в структуру, один модуль для фактического подсчета слов и один модуль для печати количества слов. Модуль пользовательского интерфейса (в данном случае один файл с функцией main
) передает аргументы командной строки парсеру, который возвращает указатель на выделенную кучей структуру, содержащую информацию о аргументах командной строки. Затем основной модуль вызывает модуль подсчета слов один раз для каждого имени файла, найденного в командной строке, а модуль подсчета слов возвращает информацию о количестве слов. Затем главный модуль вызывает модуль печати, который использует флаги командной строки для определения, какую информацию печатать и как ее форматировать.
Теперь предположим, что вы разработали свои модули, и у вас есть один или несколько файлов .c на модуль. Может быть какое-то глобальное состояние, в котором вы нуждаетесь. В этом случае файл .c-файла каждого модуля должен объявлять все глобальные переменные, и если модуль не имеет более одного файла .c, во всем проекте, который использует эту переменную, не должно быть другого файла, либо включив его с помощью extern или каким-то другим способом.
Одно из предложений заключается в том, чтобы избежать глобальных переменных ;-) –
Вы должны: показать нам код в вашем .h файле, показать код в .c файле, скопировать/вставить ошибку компилятора и показать код на линиях что компилятор жалуется. – nos
его больше, чем вы думаете, и я не хочу делиться им buahaha (: P). На самом деле, только некоторые предложения и рекомендации идеальны. – Rrjrjtlokrthjji