2009-06-06 11 views
11

Recentemente ho studiato C e in uno dei miei libri di testo ho trovato un riferimento a un file con estensione ".r". Ora, come puoi immaginare, googling "r" o "estensione file r" non è produttivo, quindi mi chiedo se potresti darmi una mano.Che cos'è una "intestazione privata" in C?

appare nel seguente blocco di codice

#include "new.r" 

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

const void * String = & _String; 

L'autore afferma che si tratta di un "header privata", ma vorrei che avrebbe potuto essere più chiara di che cosa esattamente si tratta.

+2

Sono solo curioso ... quale libro di testo stai leggendo? –

+1

Non sono veramente sicuro di cosa sia un'intestazione privata o cosa stia facendo questo codice, ma il file .r non è significativo. Le estensioni dei file sono solo suggerimenti. – Zifre

+0

Definitivamente dicci qual è il libro. – jmucchiello

risposta

7

L'istanza in cui ho incontrato un file .r è in Object-oriented Programming with ANSI-C, in cui un file .r viene utilizzato come una "rappresentazione" di una classe - - (se ho capito bene) un modo per nascondere le informazioni conservando la rappresentazione interna e controllare l'accesso alle funzioni di una classe in un file di intestazione separato.

Solo l'implementazione della classe farebbe riferimento al file .r e, a tale proposito, potrebbe essere considerato come un "private header" alla classe. L'interfaccia esternamente alla classe, è stato utilizzato un normale file di intestazione .h.

A titolo di esempio, una classe può essere composto da tre file:

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

Poi, per convenzione, un programma che utilizza la classe Circle può includere il file Circle.h come interfaccia per accedere alla classe. Circle.r è strettamente utilizzato dall'implementazione della classe Circle e non da altri, quindi, rendendolo una "intestazione privata".

L'estensione del file r è fondamentalmente una convenzione che viene utilizzata e non è qualcosa che è "ufficiale" o utilizzato in qualsiasi momento. Viene utilizzato per comodità e per differenziarsi dai normali file di intestazione con un'estensione di file h.

+0

Hai il riferimento! Programmazione orientata agli oggetti, fissando ANSI-C! C'è una torta per te, devi solo sapere dove guardare. – Ziggy

5

I compilatori C non attribuiscono alcun significato particolare alle estensioni di file, quindi l'uso dell'estensione .r è solo il modo dell'autore di indicare qualcosa per convenzione. Non avendo familiarità con il libro, non so cosa potrebbe essere, ma ti assicuro che il compilatore non attribuisce alcun significato particolare al nome del file.

+0

In realtà, GCC usa l'estensione del file per capire come gestire il file - alimenta i file .c al preprocessore/compilatore/linker, i file .cpp al preprocessore C++/compilatore/linker C, i file .o al solo linker , ecc. Ovviamente questo può essere sovrascritto dalle opzioni della riga di comando, e .r non è una delle estensioni riconosciute (per quanto ne so), quindi non sto dicendo che hai torto, ma ho pensato che fosse vale la pena menzionare il comportamento. –

+1

@David: Questo è vero per i file specificati sulla riga di comando, ma non per i file # inclusi nel preprocessore. –

11

L'estensione ".r" in realtà non significa molto, probabilmente solo una convenzione personale utilizzata da quell'autore. Alcune persone chiamerebbero la loro intestazione privata "new_p.h" o qualcosa del genere.

Fondamentalmente un'intestazione privata è solo un'intestazione che deve essere inclusa solo da quel particolare file di implementazione e non da un utente. Non ha nulla a che fare con il linguaggio o il compilatore è solo una convenzione di programmazione.

+1

Se fossi io, probabilmente mi sposterò verso un'intestazione, foo.h per foo.c, con blocchi #ifdef in esso per disabilitare le cose che non volevo avere altri file (e possibilmente un #ifndef o due per un poche righe "esterne" di fronte a una variabile o due?). - - - - - Forse l'Autore usa una convenzione dove * .h è "pubblicato"/"rilasciato", ma * .r non protegge la "proprietà intellettuale" o alcuni di questi rot? – Roboprog

+0

"NewP.h" è anche un po 'popolare, è usato per esempio in X11, e "new_p.h" è usato per esempio in Qt. – ninjalj

2

Per quanto ne so da vari progetti open source che ho visto, le intestazioni private sono intestazioni destinate ad essere utilizzate solo da un particolare pezzo di codice (un file o più file). Sono utili quando, ad esempio, alcuni file hanno bisogno di accedere ai reciproci simboli/dichiarazioni, ma tali simboli/dichiarazioni non devono essere accessibili da altro codice. Oppure possono essere usati per dividere i prototipi da file .c.

Le intestazioni globali o normali vengono solitamente memorizzate in una speciale directory "include", mentre le intestazioni private rimangono vicine al codice specifico che servono.

Per quanto riguarda l'estensione "punto r", non ne ho mai sentito parlare prima. Le intestazioni private che ho visto sono denominate "punto h", come tutte le altre.

0

Come altri hanno già detto, .r non è significativo. L'intestazione privata probabilmente significa semplicemente che non dovrebbe essere incluso da qualcosa tranne il file che lo utilizza.

Questo frammento di codice sembra è sorta di emulare C++ in C. Si sta creando un const "Class" oggetto tiene le dimensioni, costruttore, distruttore, ecc per la "classe" String. Questa struttura contiene le informazioni comuni di classe per essere utilizzato da questa libreria OO per C.

0

L'idioma che ho di solito visto per le intestazioni private è quello di utilizzare la seguente convenzione di denominazione:

  • module.h - interfaccia pubblica; i nomi, le strutture e le funzioni di cui ha bisogno il codice cliente. Se possibile, non definire strutture, basta dichiarare i loro nomi e utilizzare i puntatori opachi nell'interfaccia. Se stai fornendo un SDK, questa sarebbe l'intestazione pubblicata.
  • modulep.h - private header; dichiarazioni & definizioni utilizzate all'interno del modulo: il codice client non deve (e non dovrebbe) includerle. Se stai fornendo un SDK, questo non verrebbe pubblicato.
  • module.c - l'implementazione; questo userebbe sia module.h che modulep.h
Problemi correlati