|
||||
|
4.3.3 Сокрытие Данных Используя заголовочные файлы пользователь может опредлять явный интерфейс, чтобы обеспечить согласованное исползование типов в программе. С другой стороны, пользователь может обойти интерфейс, задаваемый заголовочным файлом, вводя в .c файлы описания extern. Заметьте, что такой стиль компоновки не рекомендуется: // file1.c: // «extern» не используется int a = 7; const c = 8; void f(long) (* /* ... */ *) // file2.c: // «extern» в .c файле extern int a; extern const c; extern f(int); int g() (* return f(a+c); *) Поскольку описания extern в file2.c не включаются вместе с определениями в файле file1.c, компилятор не может проверить согласованность этой программы. Следовательно, если только загрузчик не окажется гораздо сообразительнее среднго, две ошибки в этой программе останутся, и их придется икать программисту. Пользователь может защитить файл от такой недисциплинрованной компоновки, описав имена, которые не предназначены для общего пользования, как static, чтобы их областью видмости был файл, и они были скрыты от остальных частей прораммы. Например: // table.c: определения таблицы имен #include «error.h» #include «string.h» #include «table.h» const TBLSZ = 23; static name* table[TBLSZ]; name* look(char* p; int ins) (* /* ... */ *) Это гарантирует, что любой доступ к table действительно будет осуществляться именно через look(). «Прятать» константу TBLSZ не обязательно. |
|
||