Что такое "закрытый заголовок" в 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