10
votes

Pourquoi les champs de `Struct Stat` sont-ils nommés st_something?

Ceci est en référence à La structure des informations sur un fichier inode : xxx

Je cherche vraiment tout type de réponse. J'ai remarqué que tous les champs commencent par st _ et ne peuvent pas trouver une bonne explication sur Internet.


1 commentaires

Pour indiquer qu'ils contiennent des données statistiques .


3 Réponses :


0
votes

Je supposerais que c'est une convention de dénomination afin que lorsque vous voyez st _..., vous savez que cela fait partie de la structure statistique (qui commence avec ST).


1 commentaires

Je ne pensais pas que ce serait aussi simple mais il semble donc, merci.



18
votes

Cela remonte un long chemin, tout au long des premières versions C. Ils n'avaient pas de table de symboles séparés pour les membres de la structure, les noms ont été ajoutés à la table des symboles mondiaux. Avec la pollution évidente de l'espace de noms mondial mondial qui cause. La solution de contournement était la même que vous utilisez sur Enums aujourd'hui, préfixez-les avec quelques lettres pour éviter les collisions de noms.

C'est une sorte d'enregistrement historique. Lorsque vous voyez une structure avec ce type de noms de membres, vous savez que c'est vieux .


0 commentaires

4
votes

En plus de la réponse de Hans, je pense que le nom de collision de nom est toujours d'actualité. Même si des champs modernes C STREST ne sont pas dans l'espace de nom global, ils peuvent entrer en conflit avec les définitions de macro.

C'est l'une des raisons pour lesquelles tout le monde utilise normalement les majuscules pour les macros et les minuscules pour d'autres identifiants, mais malheureusement, cela n'est pas toujours possible. La bibliothèque C elle-même a des macros en minuscule: fondamentalement, toutes les fonctions de la bibliothèque peuvent avoir une contrepartie macro qui "surcharge" la fonction à des fins d'optimisation. Dans votre exemple, vous pouvez facilement imaginer en C (POSIX, tout) apparaissant une fonction blksize . S'il n'y aurait pas de st _ préfixe pour les membres STAT Un jour, vous souhaitez surcharger cette fonction, vous seriez en difficulté.

avec C11 et ses macros génériques de type qui utilisent _generic de telles macros seront encore plus courants. Donc, si vous concevez une bibliothèque qui doit être utilisée dans beaucoup de code dans lequel vous n'avez pas la main sur la manière dont les identifiants sont choisis, vous feriez encore mieux avec une telle convention de dénomination.

Tout cela s'applique non seulement aux membres struct , mais également aux noms de paramètres et aux variables des fonctions inline .


1 commentaires

Un exemple est des macros comme #define st_atime st_atim.tv_sec , ce qui fait st_atime un nom global qui ne respecte pas les règles de mise en scorage.