2011-11-02 14 views
6

Nei nostri progetti abbiamo deciso di prefissare variabili membro e alcuni metodi privati ​​/ protetti con underscore (quindi con "_").Membri di classe con prefisso (_)

Durante una discussione è stato affermato che questo è sconsigliato a causa di alcune incompatibilità con alcuni compilatori/linker su alcune piattaforme. Dato che vogliamo essere il più portatile possibile, mi piacerebbe esserne sicuro.

Anche io considero that prefixing globals with underscores in C può essere un problema.

Lo stesso vale per C++ - linkage e, in tal caso, in quali casi (piattaforme/compilatori/linker)?

risposta

11

Dalla C++ 03 di serie: §17.4.3.1.2/1

certi insiemi di nomi e le firme delle funzioni sono sempre riservati alla realizzazione:

  • Ogni nome che contiene una doppia sottolineatura (__) o inizia con un trattino basso seguito da una lettera maiuscola (2.11) riservata all'implementazione per qualsiasi utilizzo.

  • Ogni nome che inizia con un carattere di sottolineatura è riservato all'implementazione da utilizzare come nome nello spazio dei nomi globale.

Il testo equivalente è presente in C++ 11 §17.6.4.3.2/1

+8

+1. In altre parole, l'utilizzo dell'OP è sicuro, * a condizione che * i membri non inizino con una lettera maiuscola. Ma mi raccomando di non mettere in evidenza i caratteri di sottolineatura in generale, perché è troppo facile rompere accidentalmente una delle regole mostrate qui. – jalf

+1

Completamente d'accordo con @jalf. Se vuoi, usa un prefisso diverso, come 'm_' ... –

+3

Queste sono le regole ufficiali. In passato, ho avuto problemi con le macro nei file di intestazione di sistema che corrispondono anche a nomi che iniziano con un trattino basso seguito da una piccola lettera. E come regola generale, per la leggibilità, evitare il segno di sottolineatura alle due estremità di un simbolo. –

2

Si prega di guardare anche qui: What are the rules about using an underscore in a C++ identifier?

Ho visto un sacco di codice utilizzando singoli trattini bassi come prefisso o doppio trattino di sottolineatura in un identificatore e ha semplicemente funzionato. Ma non lo sai mai. Gli identificatori sono riservati e tutto può succedere, a seconda del compilatore.

4

Personalmente, io uso m_name, con 'm' in piedi per 'membro'.

A proposito, uso anche p_ per i parametri nelle mie funzioni e g_ per i pochi valori globali inevitabili.

(poi io di solito ottenere sbattuto da così utenti, perché sembra notazione ungherese ;-) ma non lo è.)

+2

e downvoted;) – mlvljr

+3

@mlvljr grazie per questo commento costruttivo che aiuta me e la comunità;) Questa non è una notazione ungherese, ma viene erroneamente così come viene insegnata alle persone che "la notazione ungherese è cattiva" e applica questa regola senza pensare. – Offirmo

+0

Dubito davvero che le creazioni di Charles Simonyi possano essere "cattive", anche se non è pensabile, – mlvljr

Problemi correlati