Ce n'double trait de soulignement ( __const) signifie en C?
extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;
Je l'ai trouvé au-dessus de la définition de la fonction dans le fichier /usr/include/netinet/éther.h sur une machine Linux.
Quelqu'un peut m'expliquer ce que le double souligne dire en face de const (mot-clé), addr (identifiant) et enfin __JETER.
- Il y a un très, très bon résumé des règles pour les identificateurs réservés ici: stackoverflow.com/questions/228783/...
- Techniquement, le x-ref est réservé identifiants pour C++, mais il est (maintenant) une bonne information de la norme C trop.
Vous devez vous connecter pour publier un commentaire.
En C, les symboles commençant par un caractère de soulignement suivi par une lettre majuscule ou un autre trait de soulignement sont réservés pour la mise en œuvre. Vous en tant qu'utilisateur de C ne doit pas créer des symboles qui commencent avec la réserve de séquences. En C++, la restriction est plus rigoureux; vous, l'utilisateur ne peut pas créer un symbole contenant un double trait de soulignement.
Donné:
La
__const
notation est là pour permettre la possibilité (peu probable) qu'un compilateur que ce code est utilisé avec des supports prototype de notations, mais n'ont pas une compréhension correcte de la norme C89 mot-cléconst
. Leautoconf
les macros peuvent toujours vérifier si le compilateur a le support pourconst
; ce code peut être utilisé avec une fracture du compilateur qui n'ont que le soutien.L'utilisation de
__hostname
et__addr
est une mesure de protection pour vous, l'utilisateur de l'en-tête. Si vous compiler avec GCC et le-Wshadow
option, le compilateur va vous avertir lorsque des variables locales à l'ombre d'une variable globale. Si la fonction utilisée justehostname
au lieu de__hostname
, et si vous aviez une fonction appeléehostname()
, il y avait une répétition. 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é avec une certaine forme de "jeter specification". Ce n'est pas la norme C; il est plus comme le 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 à un compilateur spécifique à l'extension de la norme de la syntaxe du C.Section 7.1.3 de la norme (ISO 9899:1999) dit:
Voir aussi Quelles sont les règles concernant l'utilisation d'un trait de soulignement dans un C++ identificateur; un grand nombre des mêmes règles s'appliquent à la fois le C et le C++, bien que l'embedded double-trait de soulignement de la règle est en C++ uniquement, comme indiqué en haut de cette réponse.
Noms avec double principaux traits de soulignement sont réservés pour une utilisation par la mise en œuvre. Cela ne veut pas nécessairement dire qu'ils sont à l'intérieur de soi, bien qu'ils soient souvent.
L'idée est, vous n'êtes pas autorisé à utiliser tous 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
n'est pas une partie de C++, mais Microsoft peut ajouter à C++/CLI convaincue qu'aucun code existant devriez avoir quelque chose commeint __gcnew;
en ce qui permettrait d'arrêter la compilation).Pour trouver ces extensions spécifiques veux dire, c'est à dire
__const
vous aurez besoin de consulter la documentation de votre compilateur/plate-forme. 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) à la fonction d'interface et d'ignorer les__const
et__THROW
décorations qui apparaissent dans l'en-tête.Par convention, dans certaines bibliothèques, cela indique qu'un symbole particulier est pour un usage interne et ne sont pas destinés à faire partie de l'API publique de la bibliothèque.
__THROW
==throw()
et si const est pris en charge alors__const
==const
, ou quelque chose comme ça?int
et prend une chaîne de caractères (char *
) et unstruct ether_addr
pointeur. Il n'a pas d'importance quel type de chaîne que vous passez le nom de la fonction ne pas le modifier. C'est tout ce que vous devez vraiment savoir. Si vous écrivez la fonction, vous devriez vous inquiéter à propos de la sémantique de__const
. Le__THROW
bits est dénuée de sens en C, sauf si il y a#define __THROW /* Nothing */
ou un compilateur spécifique de l'extension est utilisé; vous n'avez pas à vous inquiéter à ce sujet, donc.Le trait de soulignement __const signifie que ce mot-clé est un compilateur de l'extension et de l'aide il n'est pas portable (Le mot-clé const a été ajouté à C dans une révision ultérieure, 89 je crois).
L' __LANCER est en quelque sorte également de l'extension, je suppose qu'il est défini à certains __attribute__(quelque chose) si gcc est utilisé, Mais je ne suis pas sûr que et trop paresseux pour vérifier.
L' __addr peut tout signifier le programmeur voulait dire, C'est juste un nom.