2012-05-14 1 views
0

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

Я решил создать файл variable.c для определения переменных. В переменных.h у них есть ключевое слово extern и в c-файле они определены. Однако, когда я включаю «variables.h» в другие c-файлы , я получаю такие ошибки, как «отсутствующий двоичный оператор», «var_1 undefined» и т. д.

Предложения?

+3

Одно из предложений заключается в том, чтобы избежать глобальных переменных ;-) –

+0

Вы должны: показать нам код в вашем .h файле, показать код в .c файле, скопировать/вставить ошибку компилятора и показать код на линиях что компилятор жалуется. – nos

+0

его больше, чем вы думаете, и я не хочу делиться им buahaha (: P). На самом деле, только некоторые предложения и рекомендации идеальны. – Rrjrjtlokrthjji

ответ

1

У меня есть предложение: использовать область действия.

Хорошо написанные программы на C редко нуждаются во многих глобальных переменных, а большинство глобальных переменных требуется для написания хорошо написанной программы C только одним или двумя файлами .c. Не имеет смысла использовать одни и те же глобальные переменные во всех файлах .c в большой программе, потому что тогда вы теряете преимущества information hiding и modularity. Ваша программа становится хрупкой и трудно меняющейся, потому что изменение одной части программы влияет на глобальные переменные и, таким образом, влияет на всю оставшуюся часть программы.


EDIT: Предложения по предотвращению глобальных переменных

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

Давайте рассмотрим быстрый пример деления программы на модули. Обычно программа, видимая пользователем, будет иметь некоторую логику пользовательского интерфейса, некоторую бизнес-логику и, возможно, оверлей подключения к базе данных. Каждая из этих вещей представляет как минимум один модуль, возможно, несколько. В качестве нашего примера давайте оставим базу данных и рассмотрим такую ​​программу, как Unix wc. Он читает файл, подсчитывает слова и печатает количество слов. Простой, не так ли? Ну, даже эта простая программа должна иметь один модуль для анализа аргументов командной строки и помещения этих аргументов в структуру, один модуль для фактического подсчета слов и один модуль для печати количества слов. Модуль пользовательского интерфейса (в данном случае один файл с функцией main) передает аргументы командной строки парсеру, который возвращает указатель на выделенную кучей структуру, содержащую информацию о аргументах командной строки. Затем основной модуль вызывает модуль подсчета слов один раз для каждого имени файла, найденного в командной строке, а модуль подсчета слов возвращает информацию о количестве слов. Затем главный модуль вызывает модуль печати, который использует флаги командной строки для определения, какую информацию печатать и как ее форматировать.

Теперь предположим, что вы разработали свои модули, и у вас есть один или несколько файлов .c на модуль. Может быть какое-то глобальное состояние, в котором вы нуждаетесь. В этом случае файл .c-файла каждого модуля должен объявлять все глобальные переменные, и если модуль не имеет более одного файла .c, во всем проекте, который использует эту переменную, не должно быть другого файла, либо включив его с помощью extern или каким-то другим способом.

+0

Хорошо, похоже, мой способ иметь все глобальные вары в один не так хорош (думал, что это будет «чисто»). Итак, что вы предлагаете? – Rrjrjtlokrthjji

+0

@Nick Я редактирую свой ответ с более подробными предложениями для вашей программы. В среднесрочной перспективе, однако, купите или займите [Code Complete] (http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670), прочитайте его и следуйте его рекомендациям. –

+0

Хорошо, поэтому в общих чертах вы советуете мне сохранять каждую переменную там, где она должна выполнять свою работу, и использовать как можно менее глобальные вары? – Rrjrjtlokrthjji

 Смежные вопросы

  • Нет связанных вопросов^_^