Newsgroup: it.comp.lang.c++
Titolo: Simbolo Underscore

Sono un programmatore dilettante e solo da 1 anno programmo in C.
Ho letto molto, ma non ho ancora trovato il significato del simbolo
underscore (alle volte doppio) che c'è davanti a certe funzioni. A che serve
visto che funzionano anche senza? Grazie mille. Ciao.

 visto che funzionano anche senza?
Quel simbolo, quando lo trovi, fa semplicemente parte del nome della
funzione o della variabile. Tieni però presente che il suo uso, se
prefisso, è riservato agli implementatori del compilatore.
EMG


Non è del tutto esatto:
1. gli identificatori che iniziano per doppio underscore (__) e per
underscore seguito da una lettera maiuscola sono riservati
all'implementatore per qualsiasi uso e in qualsiasi scope
2. gli altri tipi di identificatori che iniziano per underscore sono
riservati all'implementatore soltanto nel namespace globale.
Ad esempio, una funzione membro o una variabile membro può avere un nome
che inizia con underscore seguito da una lettera minuscola o un numero,
giacchè tale nome non appartiene al namespace globale.
Personalmente, comunque, credo che sia ragionevole evitare l'underscore
iniziale in ogni caso.
Max

 riservati all'implementatore soltanto nel namespace globale.
kuesto vale solo se l'us e' seguito da una maiuscola. resta il fatto 
che e' meglio evitarli
 


No. Se fosse così il mio punto 2. non aggiungerebbe nulla al punto 1.
Trascrivo il frammento dello Standard che conferma quanto ho scritto.
   [17.4.3.1.2]
   Each name that contains a double underscore (_ _) or begins with
   an underscore followed by an upper­case letter (2.11) is reserved
   to the implementation for any use.
   Each name that begins with an underscore is reserved to the
   implementation for use as a name in the global namespace.  
In sostanza puoi usare "_foo" come nome di un metodo o di un membro dati,
o come nome qualsiasi in un namespace che NON sia il namespace globale.
Max

 Non č del tutto esatto:
Grazie della precisazione.
EMG

all'implementatore per qualsiasi uso e in qualsiasi scope
Trovo questa frase fuorviante anche se non errata. Io avrei
preferito qualcosa del tipo
  1. gli identificatori che contengono in qualunque
     punto un doppio underscore (__) o che iniziano
     per underscore seguito da una lettera maiuscola
     sono riservati all'implementatore per qualsiasi
     uso e in qualsiasi scope
Concordo con l'idea di stare alla larga dagli identificatori
che iniziano con underscore sempre e comunque.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

    implementation for use as a name in the global namespace.
usato nel NS #globale#
ricapitolando
__foo   : riservato sempre e comunque
foo__   : idem
Foo__fy : idem
_Foo    : idem
_foo    : lo puoi usare, all'interno di classi, funzioni, namespaces che
          non sono quello globale.
chiaro? no?-)
e' per questo che e' meglio non usarli... troppo farraginoso
invece foo_ o Foo_ sono sempre ammessi, e quindi sono da preferire

 preferito qualcosa del tipo
Sei troppo buono. Sebbene "iniziare per" sia un caso particolare di
"contenere", la regola delo standard č diversa, quindi la mia frase č
errata. In realtň, intendevo scrivere quello che hai scritto tu; mi sono
confuso.
Max

      uso e in qualsiasi scope
Sei sicuro? Questa non la sapevo. Pensavo ci fosse il vincolo solo per
l'underscore utilizzato all'inizio dell'identificatore.
EMG


Sì, è giusto; sono io che ho sbagliato nell'esporre in italiano quella
clausola. In un mio messaggio in questo filone ho riportato il frammento
originale dello standard.
Max

o come nome qualsiasi in un namespace che NON sia il namespace globale.
Io sinceramente preferisco usare l'underscore in fondo al nome, e solo
nei parametri delle funzioni membro.
Il Ghenio
-----
ZIO : Fun and games are over with. Anyone who dares
get in my way shall perish.
DIO ci salvi dagli ocx del Viral Basic.
-----

 iniziale in ogni caso.
Infatti.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

confuso.
La frase non e' errata perche' tu hai detto che gli
identificatori che iniziano con doppio underscore oppure
con underscore piu' maiuscola sono riservati.
Questo e' sacrosanto (implicazione semplice: "inizia con
doppio underscore oppure con undescore e maiuscola" =>
"riservato").
Semplicemente non hai detto *tutta* la verita' :DDD
Il testo citato dello standard si spinge un po' piu' in
la' (anche se comunque non arriva alla doppia implicazione).


invece foo_ o Foo_ sono sempre ammessi, e quindi sono da preferire
Se mi trovo a leggere codice di qualcuno che mette l'underscore finale
ai nomi dei membri gli formatto l'hd in remoto... 8-/
Luc.

 ai nomi dei membri gli formatto l'hd in remoto... 8-/
Scusa ma mi sembra che tu fissi l'attenzione su aspetti molto secondari
della programmazione.
EMG

della programmazione.
Gli aspetti primari sono tutti 'occupati' nel lavoro... il NG è solo
un hobby (spero che lo sia anche per voi...)
Luc.
PS: quando dovrai sbattere la testa su codice scritto da altre persone
vedrai se ciò che dico è tutto campato in aria...


A me personalmente non piace, ma e' una convenzione adottata da persone
di cui ho molta stima.
Ciao,
Nicola

 vedrai se ciò che dico è tutto campato in aria...
Forse in 17 anni di attività qualche volta mi sarà capitato, tu che ne
pensi? E siccome è così, cerco accuratamente di evitare di ripetere
l'esperienza, quando possibile.
EMG

ai nomi dei membri gli formatto l'hd in remoto... 8-/
Io li uso spessissimo come parametri delle funzioni membro ed in
special modo dei costruttori.
Quanti secondi di vita hai lasciato al mio hard-disk?


Quanti secondi di vita hai lasciato al mio hard-disk?
Dipende fra quanto dovrò smanettare sul tuo codice... 8)
Luc.

l'esperienza, quando possibile.
Questa frase non l'ho proprio capita, scusa...
Luc.

 uso XXX.
E questo sarebbe meglio dell'underscore finale? bah...
L'unica convenzione che considero accettabile e' qualificare pienamente
i nomi:
"this->nome" per i membri non statici, namespace::classe::nome per
quelli statici, namespace::nome (o ::nome) per tutto il resto.
Ciao,
Nicola