Введение в язык Си++

         

Скрытие Данных


Используя заголовочные файлы пользователь может определять явный интерфейс, чтобы обеспечить согласованное использование типов в программе. С другой стороны, пользователь может обойти интерфейс, задаваемый заголовочным файлом, вводя в .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 #include "table.h"

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

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

Это гарантирует, что любой доступ к table действительно будет осуществляться именно через look(). "Прятать" константу TBLSZ не обязательно.



Содержание раздела