Avere file di intestazione C ++ senza estensione è una buona pratica?


9

Ho una discussione con un mio collega per quanto riguarda le linee guida C ++ da seguire.

Attualmente progetta tutte le sue librerie in questo modo:

  • Usa incoerentemente lettere maiuscole e minuscole nei suoi nomi di file
  • Alcune delle sue intestazioni non hanno estensione

Credo che non avere alcuna estensione sia qualcosa di riservato per i file standard C ++ e che l'uso di lettere maiuscole sia soggetto a errori (soprattutto quando si tratta di codice che dovrebbe funzionare su Windows e Linux).

Il suo punto è che segue le Qtconvenzioni (anche per il codice che non usa Qt) e continua a dire: "Se Qt lo fa in questo modo, non può essere male".

Ora provo a mantenere una mentalità aperta, ma mi sento davvero male quando devo lavorare su / con le sue librerie. Esiste un insieme di regole comuni stabilite al riguardo? Lo standard dice qualcosa al riguardo?

Grazie mille.


3
#define signal... ... ... ("Se Qt lo fa in questo modo, non può essere male.") - Non posso dire di essere d'accordo personalmente con tutte le loro scelte di design.
appena il

@Justin: Nemmeno io. Non ho nulla contro Qt. Penso anche che sia una biblioteca fantastica, ma alcune delle loro scelte di design mi sembrano davvero sbagliate.
Il

1
@Justin Ho visto le macro iniziare con il _codice popolare e ampiamente utilizzato, ma è decisamente contro lo standard.
Luchian Grigore,

1
ma ecco un vero motivo per evitare le intestazioni senza estensioni: il mio IDE principale e l'editor di testo non le riconosceranno automaticamente. lo uso solo *.hppper un'intestazione c ++ e tutti i miei strumenti "ottengono".
Giusto il

5
Qt usa quella convenzione esattamente perché i programmatori intelligenti no. Significa che le tue intestazioni non si scontreranno con le nuove intestazioni Qt.
Saltere il

Risposte:


16

L'estensione (o la mancanza di) non causerà, per quanto ne so, problemi. Direi che eliminare del tutto l'estensione è scomodo in quanto rende difficile la ricerca di file di intestazione (ad esempio con i caratteri jolly * .h e * .hpp) e rende più difficile identificare il contenuto di un file (ad esempio se il tuo editor si affida all'estensione per scegliere la modalità di evidenziazione della sintassi corretta).

Da un punto di vista del codice non fa molta differenza, anche il case non è problematico fintanto che usi un caso coerente ovunque e non fai affidamento solo sulle differenze di caso per differenziare i file. Da un punto di vista della convenienza è più facile attenersi alle lettere minuscole e avere un'estensione (.h o .hpp).

Più importante di quanto sopra, tuttavia, è scegliere una convenzione per l'intero team di sviluppo e attenersi ad essa . È molto peggio cercare il modo in cui un file viene inserito, denominato e quale estensione utilizza ogni volta che si desidera includere qualcosa: tutti questi dovrebbero essere "indovinabili" con la conoscenza di ciò che si sta tentando di utilizzare.


Scegliere una convenzione e attenersi ad essa non è una cattiva idea, ma cosa succede se la convenzione esistente può essere migliorata? In tal caso, forse è una buona idea modificare il corso.
Kotlinski,

@kotlinski Questo è uno di quei casi in cui non c'è niente che tu possa fare per migliorare la situazione perché qualsiasi cosa tu scelga è una questione di preferenza. In realtà, avere qualche estensione, direi, è meglio di niente, perché il sistema operativo (leggi, Windows) può determinare con quale programma aprire il file in base all'estensione.
Paul,

@PaulManta: Ma non stai discutendo contro te stesso qui? Innanzitutto, dici che non c'è modo di migliorare nulla. Quindi, dici che avere un'estensione è meglio di no. Questo è un tipo di atteggiamento disfattista, dicendo che nessun cambiamento è possibile.
Kotlinski,

@kotlinski In generale, credo che dipenda da quanto vecchio codice lavoreresti, se sarebbe fattibile cambiare tutto nella nuova convenzione e quale sarebbe l'impatto delle combinazioni di convenzioni. In questo caso, però, sono d'accordo con Paul Manta: è principalmente una preferenza personale, con un'estensione preferita dalla maggior parte per motivi pratici.
Adam Bowen,

1
@kotlinski Non c'è modo di migliorare nulla, ma ci sono modi per peggiorare le cose. Questa discussione è inutile quanto la discussione su spazi contro schede. Basta scegliere una convenzione e andare a fare qualcosa di utile.
Paul,

6

Non esiste una regola (nello standard) che solo i file di intestazione standard possano essere senza estensione; il nome file può essere praticamente qualsiasi cosa tu voglia. Le buone pratiche generali, tuttavia, suggeriscono che:

  1. nessun file sarà mai senza estensione e

  2. diversi tipi di file hanno estensioni diverse, in particolare le intestazioni C ++ usano un'estensione ( .hppo .hh) diversa rispetto alle intestazioni accettabili per un compilatore C.

(Purtroppo, la seconda regola viene spesso violata e spesso si vedono file di intestazione C ++ .h. Per esperienza personale, posso assicurare che questo causerà problemi di manutenzione lungo la strada, ma è pratica comune.)

Per quanto riguarda il caso, è necessaria estrema cura, poiché i nomi dei file sono case sensitive in alcuni sistemi e non in altri. Ho visto due diverse regole che funzionano: o tutto in minuscolo nel nome del file o il nome del file segue esattamente le stesse regole relative al caso dei simboli in C ++.

In entrambi i casi, stabilisci le regole per il progetto, per consenso, e tutti le seguono.


1
Sono totalmente con James su questo. Lo rende un incubo ottenere strumenti che funzionino in modo appropriato sui 2 diversi tipi di file di intestazione se hanno la stessa estensione.

@ TomTanner Ed è anche peggio se hai file senza estensioni. Ho lavorato principalmente in un ambiente Unix, ed è sempre frustrato (e ha causato problemi) che i file eseguibili non abbiano estensione.

6
If Qt does it that way, then it can't be bad.

Sì. Sì, davvero, davvero. Il loro design della biblioteca è "Vogliamo tanto essere Java". È un casino totale. La libreria standard è molto meglio.

Inoltre, fondamentalmente, è un errore logico. Il design di Qt merita di essere emulato solo se puoi dare argomentazioni logiche sul perché sia ​​buono, non va bene solo perché è Qt.


È un argomento empirico. È un grande prodotto software utilizzato da molte persone. Se questa scelta della convenzione di denominazione causasse problemi significativi, sarebbe nota e probabilmente cambiata ormai. Dato che non è così, non può essere così male. Ciò non significa che sia la soluzione migliore, comunque.
H. Rittich,

0

Come so, dal 1998 standard, solo le intestazioni di libreria standard sarebbero senza .h. Pertanto, i file di intestazione C ++ non standard vengono convenzionalmente ancora scritti con .h. Ma tieni presente che è una convenzione, non puoi usare nessuna estensione o anche estensione .txt, è come se tu scrivessi le tue classi iniziando con lettere minuscole, funziona ancora, ma non è la convenzione.


3
Btw "Se Qt lo fa in questo modo, non può essere male." è davvero un brutto argomento ...

2
Lo standard non ha nulla da dire su come le intestazioni definite dall'utente dovrebbero essere nomi. Specifica solo i nomi delle intestazioni standard.
Mike Seymour,

0

Queste sono convenzioni, non regole che non vi sono vincoli per aderire alle convenzioni, ma le convenzioni rendono la vita più semplice quando vieni in cerca di riferimento.

come per le estensioni (.h, .hpp) quei file che sono stati inclusi nel c ++ non devono avere estensioni, è necessario usare le estensioni se si usano intestazioni diverse da c ++, come librerie c o librerie boost.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.