Question

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

Je trouve la définition de fonction ci-dessus dans /usr/include/netinet/ether.h sur une boîte Linux.

Quelqu'un peut-il expliquer ce que les doubles underscores signifient devant const (mot-clé), adr (identifiant) et enfin __THROW.

Était-ce utile?

La solution

En C, les symboles commençant par un trait de soulignement suivi soit par une lettre majuscule ou un autre trait de soulignement sont réservés à la mise en œuvre. Vous en tant qu'utilisateur de C ne devrait pas créer des symboles qui commencent par les séquences réservées. En C ++, la restriction est plus stricte; vous l'utilisateur ne peut pas créer un symbole contenant un double underscore.

Vu:

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

La notation __const est là pour permettre la possibilité (peu probable) qu'un compilateur que ce code est utilisé avec des supports notations de prototype mais ne dispose pas d'une compréhension correcte de la const de mot-clé standard C89. Les macros autoconf peuvent toujours vérifier si le compilateur a un support de travail pour const; ce code peut être utilisé avec un compilateur cassé qui ne dispose pas de ce soutien.

L'utilisation de __hostname et __addr est une mesure de protection pour vous, l'utilisateur de l'en-tête. Si vous compilez avec GCC et l'option -Wshadow, le compilateur vous avertit lorsque toutes les variables locales ombre une variable globale. Si la fonction utilisée juste hostname au lieu de __hostname, et si vous aviez une fonction appelée hostname(), il y avait une ombre. En utilisant des noms réservés à la mise en œuvre, il n'y a pas de conflit avec votre code légitime.

L'utilisation de __THROW signifie que le code peut, dans certaines circonstances, être déclarée avec une sorte de « spécification throw ». Ce n'est pas standard C; il est plus comme C ++. Mais le code peut être utilisé avec un compilateur C aussi longtemps que l'un des en-têtes (ou le compilateur lui-même) définit __THROW à vide ou à une extension spécifique au compilateur de la syntaxe standard C.


Section 7.1.3 de la norme C (ISO 9899: 1999) dit:

  

7.1.3 identificateurs réservés

     

Chaque tête déclare ou définit tous les identifiants figurant dans son paragraphe associé, et   déclare éventuellement ou définit des identificateurs listés dans ses directions de bibliothèque de futurs associés   paragraphe et des identifiants qui sont toujours réservés soit pour toute utilisation ou pour une utilisation en tant que fichier   identificateurs de champ d'application.

     

- Tous les identificateurs qui commencent par un trait de soulignement et une lettre minuscule ou d'une autre   sont toujours réservées soulignement pour toute utilisation.

     

- Tous les identificateurs qui commencent par un trait de soulignement sont toujours réservées à une utilisation comme identifiants   avec la portée du fichier dans les deux espaces de noms ordinaires et tag.

     

- Chaque nom de la macro dans l'un des sous-paragraphes suivants (y compris la future bibliothèque   directions) est réservé pour une utilisation comme spécifié si l'un de ses en-têtes associés est inclus;   sauf indication contraire (voir 7.1.4).

     

- Tous les identificateurs avec lien externe dans l'un des paragraphes suivants (y compris la   les directions de la future bibliothèque) sont toujours réservées à une utilisation comme identifiants avec externe   liaison. 154)

     

- Chaque identifiant avec champ de fichier répertorié dans l'un des sous-paragraphes suivants (y compris le   les directions de la future bibliothèque) est réservée à une utilisation comme nom de macro et comme un identificateur   déposer la portée dans le même espace de nom si l'une de ses têtes associées est inclus.

     

Pas d'autres identificateurs sont réservés. Si le programme déclare ou définit un identifiant dans un   contexte dans lequel il est réservé (autre que celle permise par 7.1.4), ou définit un réservé   identifiant comme un nom de macro, le comportement est indéfini.

     

Si le programme supprime (avec #undef) toute définition macro d'un identifiant dans le premier   groupe ci-dessus, le comportement est indéfini.

     

Note 154) La liste des identificateurs réservés avec une liaison externe comprend errno, math_errhandling,   setjmp et va_end.


Voir aussi Quelles sont les règles relatives à l'utilisation d'un trait de soulignement dans un identificateur C ++ , beaucoup de règles sont les mêmes à la fois C et C ++, bien que la règle de la double underscore intégré est en C ++ uniquement, comme mentionné en haut de cette réponse.

Autres conseils

Les noms doubles avec underscores sont réservés principaux pour une utilisation par la mise en œuvre. Cela ne signifie pas nécessairement qu'ils sont en soi interne, bien qu'ils soient souvent.

L'idée est, vous n'êtes pas autorisé à utiliser les noms commençant par __, de sorte que la mise en œuvre est libre de les utiliser dans des endroits comme l'expansion des macros, ou dans les noms des extensions de syntaxe (par exemple __gcnew ne fait pas partie de C ++ , mais Microsoft peut l'ajouter à C ++ / CLI confiant qu'aucun code existant devrait avoir quelque chose comme int __gcnew; en ce qui arrêterait la compilation).

Pour savoir ce que ces extensions spécifiques signifient, à savoir __const vous aurez besoin de consulter la documentation de votre compilateur / plate-forme spécifique. Dans ce cas particulier, vous devriez probablement envisager le prototype dans la documentation (par exemple http://www.kernel.org/doc/man-pages/online/pages/man3/ether_aton.3.html ) pour être l'interface de la fonction et ignorer les décorations __const et que __THROW apparaissent dans l'en-tête réelle.

Par convention dans certaines bibliothèques, cela signifie qu'un symbole particulier est à usage interne et non destinée à faire partie de l'API publique de la bibliothèque.

Le trait de soulignement dans __const signifie que ce mot-clé est une extension du compilateur et de l'utiliser est pas portable (Le mot-clé const a été ajouté à C dans une révision plus tard, 89 je crois). Le __THROW est aussi une sorte d'extension, je suppose qu'il se définit dans une certaine __ de __attribute (quelque chose) si gcc est utilisé, mais je ne suis pas sûr à ce sujet et trop paresseux pour vérifier. Le __addr peut signifier tout ce que le programmeur voulait que ça veut dire, il est juste un nom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top