9
votes

Qu'est-ce qu'un double soulignement signifie dans un nom de variable dans le langage C?

Duplicaté possible:

Pourquoi les gens utilisent-ils tellement __ (double soulignement)? C ++

J'étudiais le code de programmation du noyau Linux.

Il existe certaines structures de données et certaines fonctions qui commencent par un double soulignement comme: xxx

comment est-ce différent des variables normales?


3 commentaires

Stackoverflow.com/Questtions/224397/...


Pas d'accord avec dupliquer parce que cela concerne le noyau linux , qui est C et non C ++, et dans certains points est un monde de ses propres.


Regardez Stackoverflow.com/a/224420/1657476 "L'utilisation de deux soulignes (__ __ ') dans des identificateurs est réservé Pour l'utilisation interne du compilateur selon la norme ANSI-C . "


3 Réponses :


16
votes

Cela signifie que c'est un nom réservé au système. La norme C affirme que tous les noms commençant par deux soulignements, ou une lettre de soulignement et de majuscule, sont réservés à l'utilisation du système ou du compilateur et ne doivent pas être définis dans le code de l'application.


1 commentaires

S'il ne devrait pas être autorisé, alors pourquoi est-il disponible pour une utilisation? Par système, voulez-vous dire le système d'exploitation?



1
votes

C'est un type, défini dans ici (ainsi que peu d'autres endroits).

C'est par convention que, généralement un double soulignement devant un type, une variable ou un nom de fonction implique un nom toujours réservé, tel que défini à la section 7.1.3 de la norme en cours (C99).


0 commentaires

3
votes

Les autres réponses sont correctes qu'il est réservé à la mise en œuvre. Bien sûr, ici Linux devrait passer du 20ème siècle et utiliser le type Standard UINT32_T plutôt que la myriade de noms non standard ( __ u32 , U_INT32_T , ...) QU'UN PLAGE LEGACY UNICES.


4 commentaires

Ces types sont définis exactement de la même manière qu'ils sont définis par les en-têtes de bibliothèque standard (STDINT.H). Pourquoi est-ce un si gros problème si a) ils sont les mêmes types et b) ils ne sont pas exportés pour l'utilisation par les programmes d'utilisateurs?


@MFUKAR La cohérence est importante du point de vue de la maintenance. L'utilisation de dix noms différents pour le même type introduit non seulement des problèmes de compatibilité potentielles (disons, à l'aide de types spécifiques longs, UINT, ETC mélangés à Generic Int, dont la taille dépendante de la plate-forme), elle diminue la lisibilité du code.


J'ai essayé de comprendre le code du noyau c mais que ça va sur ma tête. Je pense que j'ai moins de compréhension avec des pointeurs ou une fonction de pointeur à l'intérieur des structures. Y a-t-il un livre C où je peux étudier ces sujets séparément afin que je puisse ensuite lire le code du noyau.


Je comprends où vous venez de. Ces cas de type intermixing de type malade sont plutôt rares dans le noyau Linux, j'ose dire. Bien sûr, vous trouverez le non signé long S partout dans les implémentations SYSCALL; Mais cela n'a pas vraiment d'importance, c'est par définition une partie de code spécifique à la plate-forme et le remplaçant avec le type avec un espace de stockage approprié n'aide à personne. N'oubliez pas non plus qu'il y a un groupe de personnes qui font valoir l'utilisation de types C99 en faveur des types Linux. Je ne sais pas ce qui se passe avec ça. :-)