Что такое "закрытый заголовок" в C?

Недавно я изучал C, и в одном из моих учебников я нашел ссылку на файл с расширением ".r". Теперь, как вы можете себе представить, googling "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;

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

Ответ 1

Экземпляр, в котором я встретил файл .r, находится в Объектно-ориентированное программирование с ANSI-C, где a .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.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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