Что такое "частный заголовок" в C? - PullRequest
11 голосов
/ 06 июня 2009

Я недавно изучил C , и в одном из моих учебников я нашел ссылку на файл с расширением ".r". Теперь, как вы можете себе представить, поиск в Google "r" или "расширение файла r" не продуктивен, поэтому я хотел бы знать, не могли бы вы мне помочь.

появляется в следующем блоке кода

#include "new.r"

static const struct Class _String = {
  sizeof(struct String),
  String_ctor, String_dtor,
  String_clone, String_differ
};

const void * String = & _String;

Автор упоминает, что это "частный заголовок", но я бы хотел, чтобы он мог быть более ясным относительно того, что именно это такое.

Ответы [ 6 ]

11 голосов
/ 06 июня 2009

Расширение файла ".r" на самом деле ничего не значит, вероятно, просто личное соглашение, использованное этим автором. Некоторые люди назовут свой частный заголовок "new_p.h" или что-то в этом роде.

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

7 голосов
/ 06 июня 2009

Экземпляр, в котором я обнаружил файл .r, находится в Объектно-ориентированном программировании с ANSI-C , где файл .r используется как «представление» класса - (если я правильно понимаю) способ скрыть информацию, сохраняя внутреннее представление и контролировать доступ к функциям класса в отдельном заголовочном файле.

Только реализация класса может ссылаться на файл .r, и в этом отношении его можно рассматривать как «закрытый заголовок» для класса. Интерфейс, внешний к классу, использовался обычный заголовочный файл .h.

В качестве иллюстрации класс может состоять из трех файлов:

Circle.h    /* Header file with external interfaces, such as methods. */

Circle.r    /* Representation file for internal use within the class, such as
               structs that define the internal states. */

Circle.c    /* Implementation of the Circle class. */

Тогда, по соглашению, программа, использующая класс Circle, может включать файл Circle.h в качестве интерфейса для доступа к классу. Circle.r строго используется реализацией класса Circle, а не другими, что делает его "частным заголовком".

Расширение файла r в основном является соглашением, которое используется, и не является чем-то «официальным» или используемым постоянно. Он используется для удобства и для отличия от обычных заголовочных файлов с расширением h.

5 голосов
/ 06 июня 2009
Компиляторы

C не придают никакого особого значения расширениям файлов, поэтому использование расширения .r является просто авторским способом обозначения чего-либо по соглашению. Не будучи знакомым с книгой, я не знаю, что это может быть, но будьте уверены, что компилятор не придает никакого конкретного значения имени файла.

2 голосов
/ 06 июня 2009

Насколько я могу судить по различным проектам с открытым исходным кодом, частные заголовки - это заголовки, предназначенные для использования только определенным фрагментом кода (файлом или несколькими файлами). Они полезны, когда, например, некоторым файлам нужен доступ к символам / объявлениям друг друга, но эти символы / объявления не должны быть доступны из другого кода. Или их можно использовать для разделения прототипов из файлов .c.

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

Что касается расширения 'dot r', я никогда не слышал об этом раньше. Частные заголовки, которые я видел, называются «точка h», как и все остальные.

0 голосов
/ 06 июня 2009

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

  • module.h - открытый интерфейс; имена, структуры и функции, которые нужны клиентскому коду. Если возможно, не определяйте структуры, просто объявляйте их имена и используйте непрозрачные указатели в интерфейсе. Если вы предоставляете SDK, это будет опубликованный заголовок.
  • modulep.h - закрытый заголовок; объявления и определения, используемые в модуле - клиентский код не должен (и не должен) включать их. Если вы предоставляете SDK, он не будет опубликован.
  • module.c - реализация; это будет использовать как module.h, так и modulep.h
0 голосов
/ 06 июня 2009

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

Этот фрагмент кода выглядит как эмулятор C ++ в C. Он создает объект const "Class", содержащий размер, конструктор, деструктор и т. Д. Для "класса" String. Эта структура содержит информацию общего класса, которая будет использоваться этой библиотекой OO для C.

...