Domanda

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
 __THROW;

ho trovato la definizione della funzione di cui sopra in /usr/include/netinet/ether.h su un sistema Linux.

Qualcuno può spiegare quali sono le doppie sottolineature significano davanti a const (parola chiave), addr (identificatore) e infine __THROW.

È stato utile?

Soluzione

In C, simboli iniziando con un trattino seguito da una lettera maiuscola o altro sottolineatura sono riservati per l'attuazione. È come un utente di C non dovrebbe creare simboli che iniziano con le sequenze riservati. In C ++, la restrizione è più stringente; si che l'utente non può creare un simbolo contenente una doppia sottolineatura.

Data:

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;

La notazione __const è lì per consentire la possibilità (un po 'improbabile) che un compilatore che questo codice viene utilizzato con supporti prototipo notazioni, ma non ha una corretta comprensione della parola di serie const C89. Le macro autoconf possono ancora verificare se il compilatore ha il supporto di lavoro per const; questo codice può essere utilizzato con un compilatore rotto che non ha che il supporto.

L'uso di __hostname e __addr è una misura di protezione per voi, l'utente della testata. Se si compila con GCC e l'opzione -Wshadow, il compilatore vi avviserà quando tutte le variabili locali ombra una variabile globale. Se la funzione utilizzata solo hostname invece di __hostname, e se si ha una funzione chiamata hostname(), ci sarebbe un pedinamento. Utilizzando nomi riservati alla realizzazione, non v'è alcun conflitto con il codice legittimo.

L'uso di __THROW significa che il codice può, in alcune circostanze, essere dichiarato con una sorta di 'specifiche tiro'. Questo non è standard C; è più simile a C ++. Ma il codice può essere utilizzato con un compilatore C fino a quando una delle intestazioni (o il compilatore stesso) definisce __THROW da svuotare, oa qualche estensione specifica compilatore della sintassi standard C.


sezione 7.1.3 dello standard C (ISO 9899: 1999) dice:

  

7.1.3 identificatori riservati

     

Ogni intestazione dichiara o definisce tutti gli identificatori elencati nella sottoclausola associato, e   opzionalmente dichiara o definisce identificatori elencati nelle sue future direzioni libreria associati   sottoclausola e identificatori che sono sempre riservati sia per qualsiasi uso o per l'uso come file di   identificatori campo di applicazione.

     

- Tutti gli identificatori che iniziano con un carattere di sottolineatura e sia una lettera maiuscola o nell'altro   sottolineatura sono sempre riservate per qualsiasi uso.

     

- Tutti gli identificatori che iniziano con un carattere di sottolineatura sono sempre riservati per l'utilizzo come identificatori   con ambito di file in entrambi gli spazi dei nomi ordinari e tag.

     

- Ogni nome di macro in una qualsiasi delle seguenti sottoclausole (compreso il futuro biblioteca   le direzioni) è riservato per uso come specificato se uno qualsiasi dei suoi intestazioni associate è incluso;   se non diversamente specificato (vedi 7.1.4).

     

- Tutti identificatori con linkage esterno in uno qualsiasi dei seguenti sottoclausole (compresa la   direzioni future della biblioteca) sono sempre riservati per l'uso come identificatori con esterni   linkage. 154)

     

- Ogni identificatore con ambito di file elencati in uno dei seguenti sottoclausole (compreso il   direzioni future biblioteca) è riservato per l'uso come un nome di macro e come identificativo con   depositare portata nello stesso spazio nome se uno qualsiasi dei suoi intestazioni associate è incluso.

     

Non ci sono altri identificatori sono riservati. Se il programma dichiara o definisce un identificatore in un   contesto in cui è riservata (non come consentito dalla 7.1.4), o definisce una riservata   identificatore come un nome di macro, il comportamento è indefinito.

     

Se il programma rimuove (con #undef) qualsiasi definizione di macro di un identificatore nel primo   gruppo di cui sopra, il comportamento è indefinito.

     

La nota 154) L'elenco degli identificatori riservati con esterni di collegamento comprende errno, math_errhandling,   setjmp e va_end.


Si veda anche Quali sono le regole sull'utilizzo di una sottolineatura in un C ++ identificatore , un sacco di le stesse regole si applicano sia C e C ++, anche se la regola della doppia sottolineatura incorporato è in C ++ solo, come accennato nella parte superiore di questa risposta.

Altri suggerimenti

I nomi con doppia sottolineatura principali sono riservati per l'utilizzo da parte l'attuazione. Questo non significa necessariamente che sono interni per sé, anche se spesso sono.

L'idea è, non ti è permesso di utilizzare per eventuali nomi che iniziano con __, quindi l'implementazione è libero di usarli in luoghi come espansioni di macro, o nei nomi di estensioni di sintassi (ad esempio __gcnew non è parte di C ++ , ma Microsoft può aggiungerlo a C ++ / CLI sicuri che nessun codice esistente dovrebbe avere qualcosa di simile int __gcnew; in esso che avrebbe smesso di compilazione).

Per scoprire che cosa significano queste estensioni specifiche, vale a dire __const è necessario consultare la documentazione del compilatore specifica / piattaforma. In questo caso particolare, probabilmente si dovrebbe prendere in considerazione il prototipo nella documentazione (ad esempio, http://www.kernel.org/doc/man-pages/online/pages/man3/ether_aton.3.html ) per essere l'interfaccia della funzione e ignorare le decorazioni __const e __THROW che visualizzare nell'intestazione reale.

Per convenzione in alcune librerie, significa che un simbolo particolare, è per uso interno e non destinato a far parte della API pubblica della biblioteca.

La sottolineatura in __const significa che questa parola chiave è un'estensione del compilatore e il suo utilizzo non è portabile (La parola chiave const è stato aggiunto al C in una revisione successiva, 89 credo). Il __THROW è anche una sorta di estensione, presumo che venga definito in una certa __ __attribute (qualcosa) se si utilizza gcc, ma non sono sicuro su questo e troppo pigro per controllare. Il __addr può significare qualsiasi cosa il programmatore ha voluto che dire, è solo un nome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top