Non posso parlare con Python.
Nel caso di C, gli identificatori con trattini bassi iniziali sono supposti da riservare per l'uso dall'implementazione:
7.1.3 Reserved identifiers
1 Each header declares or defines all identifiers listed in its associated subclause, and
optionally declares or defines identifiers listed in its associated future library directions
subclause and identifiers which are always reserved either for any use or for use as file
scope identifiers.
— All identifiers that begin with an underscore and either an uppercase letter or another
underscore are always reserved for any use.
— All identifiers that begin with an underscore are always reserved for use as identifiers
with file scope in both the ordinary and tag name spaces.
— Each macro name in any of the following subclauses (including the future library
directions) is reserved for use as specified if any of its associated headers is included;
unless explicitly stated otherwise (see 7.1.4).
— All identifiers with external linkage in any of the following subclauses (including the
future library directions) and errno are always reserved for use as identifiers with
external linkage.184)
— Each identifier with file scope listed in any of the following subclauses (including the
future library directions) is reserved for use as a macro name and as an identifier with
file scope in the same name space if any of its associated headers is included.
2 No other identifiers are reserved. If the program declares or defines an identifier in a
context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved
identifier as a macro name, the behavior is undefined.
Bozza online C 2011 (N1570)
IOW, se scrivi un codice C, non dovresti usare i trattini bassi di sottolineatura per i tuoi identificatori (nomi di variabili, nomi di funzioni e struct
, union
e enum
tag nomi); se lo fai, corri un leggero rischio di collisione di un nome con un identificatore utilizzato dall'implementazione durante la traduzione. Ad esempio, se si definisce una funzione denominata _write
, ciò potrebbe entrare in conflitto con una funzione predefinita _write
utilizzata dall'implementazione printf
nella libreria standard.
Poiché il comportamento sul dichiarare o utilizzare un identificatore riservato è indefinito , il compilatore non è obbligato a rilasciare alcuna diagnostica; non saprai che c'è un problema (se ce n'è uno) fino al runtime, e quel problema potrebbe essere abbastanza sottile e difficile da diagnosticare. I compilatori con cui ho familiarità non pubblicheranno alcuna diagnostica o non riescono a tradurre il codice.
Nota che non c'è nulla di magico nel carattere di sottolineatura stesso: è solo un altro carattere che puoi usare in un identificatore. L'unica vera differenza tra _data
e data
è che sono nomi distinti; il carattere di sottolineatura non aggiunge alcun significato oltre a questo. Ancora, l' intento è che i nomi con underscore principali sono riservati per l'implementazione, ma il compilatore in genere non impone questo durante la traduzione.