Potrebbe iniziare variabili / membri con un trattino basso il compilatore?


12

Mi è stato insegnato fin dalle superiori a definire variabili come questa:

int _a;

o

int __a;

dovrebbe essere considerato una cattiva pratica perché alla fine questo potrebbe risolvere i compilatori che usano variabili che iniziano con un trattino basso per nominare le variabili temporanee.

Per quanto ne so, questo è il motivo per cui ad alcune persone piace spostare il carattere di sottolineatura alla fine del nome, come:

int a_;

Tuttavia, vedo un sacco di codice tutt'intorno che fa uso di variabili iniziali di sottolineatura. E quel codice si sviluppa abbastanza bene con Visual Studio 2010 e g ++ 4.x.

Quindi mi chiedo: è questo un problema al giorno d'oggi? I compilatori moderni sono più intelligenti sulle convenzioni di denominazione?


Non è una vera risposta, ma è probabile che i compilatori C ++ di Microsoft siano specificamente più indulgenti a riguardo perché è lo stile interno di Microsoft di utilizzare le sottolineature prima delle variabili dei membri privati ​​(almeno in C #). So che g ++ può ancora avere problemi con i caratteri di sottolineatura principali.
KChaloux,

6
Potresti trovare utili le risposte a questa domanda .
Blrfl

1
@KChaloux se pensi che il team di compilatori C ++ di Microsoft, esistente da oltre 20 anni, abbia stabilito le regole sui nomi identificativi accettabili in base alle abitudini di alcune persone nel team C #, non sai come funziona Microsoft :-). Seriamente, sono passati 21 anni da quando hanno rilasciato il loro primo compilatore C ++ e queste regole risalgono a così lontano, o più avanti nella base di codice del compilatore C originale.
Kate Gregory,

@Kate Stavo solo sottolineando che sapevo per certo che lo usavano in C #. Non uso il compilatore C ++ di Microsoft, o non conosco molto bene l'ambiente lì, quindi stavo inferendo il loro uso di quello stile di denominazione in C ++ dalla mia esperienza con C #. Mai fatto eventuali reclami che la regola C # è venuto prima.
KChaloux,

Risposte:


17

Apparentemente stai fraintendendo il motivo per cui le sottolineature dei prefissi sono una cattiva pratica. Per farla breve, è perché gli standard C e C ++ riservano questi prefissi per i dettagli dell'implementazione, ad esempio per l'implementazione della libreria standard. (nota che _ e __ non sono riservati per le stesse cose, vedi commenti)

Anche se i nomi sono nell'ambito (spazio dei nomi, classe, ecc.), Ci possono essere alcuni nomi globali, in particolare le macro, che usano questi prefissi e potrebbero rompere silenziosamente il codice se li usi anche tu.

Quindi, fondamentalmente, la maggior parte delle volte è sicuro usare questi prefissi MA se non li usi hai una garanzia del 100% che la tua denominazione non entrerà mai in conflitto con i nomi dell'implementazione.

Ecco perché, nel dubbio, non usare questi prefissi.


3
i tuoi commenti si applicano al prefisso di due trattini bassi ma non a un singolo trattino basso
Kate Gregory

1
@KateGregory: i nomi con un carattere di sottolineatura iniziale sono riservati all'uso da parte dell'implementazione per i nomi nello spazio dei nomi globale. Un carattere di sottolineatura iniziale seguito da un secondo carattere di sottolineatura o maiuscolo sono riservati per qualsiasi uso (possono essere utilizzati per le macro dall'implementazione). Pertanto, un carattere di sottolineatura iniziale seguito da una lettera minuscola potrebbe essere corretto negli ambiti locali, ma è meglio evitare di inciampare e utilizzare un nome riservato.
Bart van Ingen Schenau,

4
@KateGregory: come membro, _limitnon è un errore, ma come funzione globale lo è. Penso che sia meglio avere una semplice politica che dice "non usare i caratteri di sottolineatura principali, senza eccezioni" rispetto a una politica che li consenta in alcuni contesti e non in altri. Ma possiamo concordare di dissentire su questo. E per essere chiari, non ho problemi con i caratteri di sottolineatura in altri punti rispetto all'inizio.
Bart van Ingen Schenau,

2
@BartvanIngenSchenau: solo per interesse: una semplice politica come "usa i caratteri di sottolineatura principali solo e solo per i membri della classe privata" non dovrebbe portare a problemi tecnici, cosa pensi, è vero?
Doc Brown,

1
@KateGregory Giusto per chiarire, sono d'accordo che le regole sono più precise di ciò che sto dicendo nella mia risposta; ma riflette la mancanza di precisione della mia memoria quando provo a ricordare quali sono esattamente le regole. Dato che tendo ad evitare di dover conoscere eccezioni (non la funzionalità), preferisco regole generali facili da seguire, in particolare per tali regole non così importanti. La cosa divertente è che sono più a mio agio con le mosse semantiche che ricordare questo. Forse non è divertente ora che ci penso ...
Klaim

16

L'uso di due caratteri di sottolineatura è decisamente negativo: è riservato ai dettagli di implementazione specifici del compilatore. Questo non si applica all'utilizzo di un carattere di sottolineatura.

Alcune persone odiano i caratteri di sottolineatura. Sia che chiami qualcosa m_indexo highest_priceo _a- la detestino. Ho lavorato con qualcuno 25 anni fa che mi ha parlato di una specifica stampante IBM (una molto popolare) che si adattava a più righe sulla pagina omettendo il pixel inferiore su ogni altra riga. Questo andava bene per i memo, o per l'output di grandi quantità di numeri e simili, ma ha avuto l'effetto per il codice di rendere invisibile metà dei caratteri di sottolineatura. (Sì, davvero!) Le persone di quella generazione generalmente hanno l'odio irrazionale di sottolineatura, sia per interazione con quella stampante che per lavoro con qualcuno che vi picchia il fatto che i caratteri di sottolineatura non debbano essere usati.

La maggior parte delle persone trovano utilizzando lettere maiuscole e minuscole (un'opzione che non avevamo, per esempio, Fortran) un approccio più leggibile: mIndex, HighestPrice, aresistono abbastanza bene agli esempi precedentemente sottolineato. Ti darò due regole:

  • non avviare mai nulla (funzione, variabile, macro, typedef) con due trattini bassi
  • scegli una convenzione coerente (ad es. _limitper i parametri di funzione, m_limitper le variabili membro, non usare mai trattini bassi, maiuscole e minuscole, maiuscole in ogni parola, ungherese, qualcosa ) e attenersi ad essa. Non scherzare a volte con caratteri di sottolineatura all'inizio, a volte alla fine, a volte non usandoli e cinque diverse convenzioni sul case. Sii coerente.

La stampante in questione è sparita da tempo. Se ti piace usare un carattere di sottolineatura alla volta, sentiti libero di farlo. Ma capisci, esistono ancora gli odiatori di sottolineatura.


"Sia che tu chiami qualcosa m_index, il prezzo più alto o _a - lo detestano" Non senza motivo! Non hai fatto menzione del fatto che ci sono regole negli standard che riguardano specificamente l'uso dei trattini bassi di riferimento negli identificatori. Perché chiedere problemi quando è così facilmente evitato? stackoverflow.com/a/228797
Max Barraclough il

non ha fatto menzione? Leggi di nuovo la prima frase.
Kate Gregory,

"Questo non si applica all'utilizzo di un carattere di sottolineatura" non è l'intera storia, vedi il mio link, che dice che condurre con il doppio trattino basso è un no-no piuttosto definito, ma che "Riservato nello spazio dei nomi globale: identificatori che iniziano con un sottolineare". Perché giocare con il fuoco?
Max Barraclough,

1
ok, ti ​​manca il punto. Il secondo paragrafo tratta dell'esistenza di persone che sono, in generale, anti-sottolineatura. Sottolineature non iniziali. Tutti i trattini bassi. Sì, è vero che oltre alla regola relativa a due caratteri di sottolineatura esiste anche una regola relativa ai caratteri di sottolineatura seguiti da una lettera maiuscola, caratteri di sottolineatura di portata globale ecc., Ma a parte ciò alcune persone odiano i caratteri di sottolineatura comunque. E quelle persone sono ciò che mi piace definire sbagliato. Non vi è alcun motivo basato su standard per obiettare a caratteri di sottolineatura senza piombo. Ma la gente lo fa comunque.
Kate Gregory,

Ecco dove non siamo d'accordo. Sì, a volte è legale iniziare un identificatore con un singolo trattino basso. Come ho detto sopra, perché giocare con il fuoco? Non inizio mai un identificatore con un carattere di sottolineatura; Lo vedo come un odore di codice (se si può dire di "vedere" un odore :-P). In questo modo, non mi preoccupo mai delle specifiche delle regole che mi dicono esattamente quando è legale farlo.
Max Barraclough,
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.