2009-06-06 17 views
11

He estado aprendiendo C recientemente, y en uno de mis libros de texto encontré una referencia a un archivo con la extensión ".r". Ahora, como puedes imaginar, buscar en Google "r" o "extensión de archivo r" no es productivo, así que me pregunto si podrías ayudarme.¿Qué es un "encabezado privado" en C?

aparece en el siguiente bloque de código

#include "new.r" 

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

const void * String = & _String; 

El autor menciona que se trata de una "cabecera privada", pero me gustaría que podría haber sido más claro en cuanto a qué es exactamente lo que es.

+2

Tengo curiosidad ... ¿qué libro de texto está leyendo? –

+1

No estoy seguro de qué es un encabezado privado, o qué está haciendo este código, pero el .r no es significativo. Las extensiones de archivo son meras sugerencias. – Zifre

+0

Definitivamente dinos qué es el libro. – jmucchiello

Respuesta

7

El caso en el que me he encontrado un archivo .r está en Object-oriented Programming with ANSI-C, cuando los expedientes .r se utiliza como una "representación" de una clase - - (si entiendo correctamente) una forma de ocultar la información manteniendo la representación interna y controlar el acceso a las funciones de una clase en un archivo de encabezado separado.

Solo la implementación de la clase se referiría al archivo .r, y en ese sentido podría considerarse como un "encabezado privado" para la clase. Se utilizó la interfaz externa a la clase, un archivo de encabezado .h normal.

A modo de ejemplo, una clase puede estar compuesto por tres archivos:

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. */ 

Entonces, por convención, un programa que utiliza la clase Circle puede incluir el archivo Circle.h como interfaz para acceder a la clase. Circle.r es estrictamente utilizado por la implementación de la clase Circle y no por otros, por lo tanto, convirtiéndolo en un "encabezado privado".

La extensión de archivo r es básicamente una convención que se utiliza, y no es algo que es "oficial" o que se usa todo el tiempo. Se usa por conveniencia y para diferenciar de los archivos de encabezado normales con una extensión de archivo h.

+0

¡Obtuviste la referencia! Programación orientada a objetos, mirando ANSI-C! Hay pastel para ti, solo tienes que saber dónde mirar. – Ziggy

5

Los compiladores de C no otorgan ningún significado particular a las extensiones de archivos, por lo que el uso de la extensión .r es solo la manera del autor de indicar algo por convención. No estoy familiarizado con el libro, no sé lo que podría ser, pero puede estar seguro de que el compilador no atribuye ningún significado particular al nombre del archivo.

+0

En realidad, GCC usa la extensión de archivo para descubrir cómo manejar el archivo: alimenta los archivos .c al preprocesador/compilador/enlazador, los archivos .cpp al preprocesador de C++/el compilador/enlazador de C, los archivos .o solo al vinculador , etc. Por supuesto, esto puede ser anulado por las opciones de línea de comandos, y .r no es una de las extensiones reconocidas (hasta donde yo sé), así que no estoy diciendo que estés equivocado, pero pensé que era vale la pena mencionar el comportamiento. –

+1

@David: es cierto para los archivos especificados en la línea de comandos, pero no para los archivos # incluidos a través del preprocesador. –

11

La extensión de archivo ".r" realmente no significa mucho, probablemente solo una convención personal utilizada por ese autor. Algunas personas nombrarían su encabezado privado "new_p.h" o algo así.

Básicamente, un encabezado privado es solo un encabezado que solo debe ser incluido por ese archivo de implementación particular, y no por un consumidor. No tiene nada que ver con el lenguaje o el compilador, es solo una convención de codificación.

+1

Si fuera yo, probablemente me inclinaría hacia un encabezado, foo.h para foo.c, con bloques #ifdef para deshabilitar las cosas que no quería que otros archivos tuvieran (y posiblemente un #ifndef o dos para un pocas líneas "externas" frente a una variable o dos?). - - - - - Tal vez el autor utiliza una convención donde * .h es "publicado"/"liberado", pero * .r no es para proteger la "propiedad intelectual" o algo así como putrefacción? – Roboprog

+0

"NewP.h" también es algo popular, se usa por ejemplo en X11, y "new_p.h" se usa, por ejemplo, en Qt. – ninjalj

2

Por lo que puedo decir de varios proyectos de código abierto que he visto, los encabezados privados son encabezados destinados a ser utilizados solo por una determinada pieza de código (un archivo o varios archivos). Son útiles cuando, por ejemplo, algunos archivos necesitan acceso a los símbolos/declaraciones de los demás, pero no se debe acceder a esos símbolos/declaraciones desde otro código. O pueden usarse para dividir prototipos de archivos .c.

Los encabezados globales o normales generalmente se almacenan en un directorio especial 'incluir', mientras que los encabezados privados permanecen cerca del código específico que sirven.

En cuanto a la extensión 'dot r', nunca había oído hablar de ella. Los encabezados privados que he visto se llaman 'punto h', como todos los demás.

0

Como han dicho otros, .r no es significativo. El encabezado privado probablemente solo significa que se supone que no debe estar incluido por nada excepto por el archivo que lo usa.

Este fragmento de código parece que es una especie de emulando C++ en C. Es la creación de un "Class" objeto que sostiene el tamaño, constructor, destructor const, etc., para la "clase" String. Esta estructura contiene información de clase común para ser utilizado por esta biblioteca OO para C.

0

La expresión general que he visto para las cabeceras privadas es utilizar la siguiente convención de nomenclatura:

  • module.h - interfaz pública; los nombres, estructuras y funciones que necesita el código del cliente. Si es posible, no defina estructuras, simplemente declare sus nombres y use punteros opacos en la interfaz. Si proporciona un SDK, este sería el encabezado publicado.
  • modulep.h - encabezado privado; declaraciones & definiciones utilizadas dentro del módulo - el código del cliente no necesita (y no debería) incluirlas. Si proporciona un SDK, esto no se publicará.
  • module.c - la implementación; esto usaría tanto module.h como modulep.h
Cuestiones relacionadas