Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / C / C++ / Введение в язык C++ / Функции и Файлы /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Заголовочные Файлы - Программирование от RIN.RU
Заголовочные Файлы



Множественные Заголовочные Файлы


Стиль разбиения программы с одним заголовочным файлом наиболее пригоден в тех случаях, когда программа невелика и ее части не предполагается использовать отдельно. Поэтому то, что невозможно установить, какие описания зачем помещены в заголовочный файл, несущественно. Помочь могут комментарии. Другой способ - сделать так, чтобы каждая часть программы имела свой заголовочный файл, в котором определяются предоставляемые этой частью средства. Тогда каждый .c файл имеет соответствующий .h файл, и каждый .c файл включает свой собственный (специфицирующий то, что в нем задается) .h файл и, возможно, некоторые другие .h файлы (специфицирующие то, что ему нужно).


Рассматривая организацию калькулятора, мы замечаем, что error() используется почти каждой функцией программы, а сама использует только . Это обычная для функции ошибок ситуация, поэтому error() следует отделить от main():


// error.h: обработка ошибок
extern int no_errors;
extern double error(char* s);


// error.c
#include
#include "error.h"
int no_of_errors;
double error(char* s) { /* ... */ }


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


Таблица символов не зависит от остальной части калькулятора за исключением использования функции ошибок. Это можно сделать явным:


// table.h: описания таблицы имен
struct name {
char* string;
name* next;
double value;
};




extern name* look(char* p, int ins = 0);
inline name* insert(char* s) { return look(s,1); }




// table.c: определения таблицы имен
#include "error.h"
#include
#include "table.h"


const TBLSZ = 23;
name* table[TBLSZ];


name* look(char* p; int ins) { /* ... */ }


Заметьте, что описания функций работы со строками теперь включаются из . Это исключает еще один возможный источник ошибок.


// lex.h: описания для ввода и лексического анализа


enum token_value {
NAME, NUMBER, END,
PLUS="+", MINUS="-", MUL="*", DIV="/",
PRINT=";", ASSIGN="=", LP="(", RP=")"
};




extern token_value curr_tok;
extern double number_value;
extern char name_string[256];




extern token_value get_token();


Этот интерфейс лексического анализатора достаточно беспорядочен. Недостаток в надлежащем типе лексемы обнаруживает себя в необходимости давать пользователю get_token() фактические лексические буферы number_value и name_string.


// lex.c: определения для ввода и лексического анализа


#include
#include
#include "error.h"
#include "lex.h"


token_value curr_tok;
double number_value;
char name_string[256];


token_value get_token() { /* ... */ }


Интерфейс синтаксического анализатора совершенно прозрачен:


// syn.c: описания для синтаксического анализа и вычисления


extern double expr();
extern double term();
extern double prim();


// syn.c: определения для синтаксического анализа и вычисления
#include "error.h"
#include "lex.h"
#include "syn.h"


double prim() { /* ... */ }
double term() { /* ... */ }
double expr() { /* ... */ }


Главная программа, как всегда, тривиальна:


// main.c: главная программа
#include
#include "error.h"
#include "lex.h"
#include "syn.h"
#include "table.h"
#include


main(int argc, char* argv[]) { /* ... */ }


Сколько заголовочных файлов использовать в программе, зависит от многих факторов. Многие из этих факторов сильнее связаны с тем, как ваша система работает с заголовочными файлами, нежели с C++. Например, если в вашем редакторе нет средств, позволяющих одновременно видеть несколько файлов, использование большого числа файлов становится менее привлекательным. Аналогично, если открывание и чтение 10 файлов по 50 строк в каждом требует заметно больше времени, чем чтение одного файла в 500 строк, вы можете дважды подумать, прежде чем использовать в небольшом проекте стиль множественных заголовочных файлов. Слово предостережения: набор из десяти заголовочных файлов плюс стандартные заголовочные файлы обычно легче поддаются управлению. С другой стороны, если вы разбили описания в большой программе на логически минимальные по размеру заголовочные файлы (помещая каждое описание структуры в свой отдельный файл и т.д.), у вас легко может получиться неразбериха из сотен файлов.


<<<  НазадВперед  >>>
 1  2  3  4 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Компоновка

Файлы как Модули

Как Создать Библиотеку

Функции

Макросы

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь