(K & R) Au moins les 31 premiers caractères d’un nom interne sont-ils significatifs?

Pris à la lettre, cela a du sens, mais que signifie exactement être un caractère significatif d’un nom de variable?

Je commence à apprendre le C en utilisant K & R. Voici une citation directe du livre:

“Au moins les 31 premiers caractères d’un nom interne sont significatifs. Pour les noms de fonction et les variables externes, le nombre peut être inférieur à 31, car les noms externes peuvent être utilisés par les assembleurs et les chargeurs sur lesquels le langage n’a aucun contrôle. Pour les noms externes , la norme ne garantit que 6 caractères et un seul cas. ”

Au fait, qu’est-ce que ça veut dire par “cas unique”?

Un seul cas signifie généralement “minuscule”. Sauf dans certains OS où cela signifie “majuscule”. Le fait est que les cas mixtes ne sont pas garantis pour fonctionner.

abcdef ABCDEF 

diffèrent que dans le cas. Ce n’est pas garanti pour fonctionner.

Le problème de «signification» est l’un des nombres de lettres pouvant être identiques.

Disons que nous n’avons que 6 caractères significatifs.

 a_very_long_name a_very_long_name_thats_too_similar 

Apparence différente, mais les 16 premiers caractères sont les mêmes. Puisque seulement 6 sont significatifs, ceux-ci sont la même variable.

Cela signifie ce que vous craignez que cela signifie. Pour les noms externes, le standard C à l’époque K & R 2nd ed. a été écrit ne donne vraiment que six caractères insensibles à la casse! Donc, vous ne pouvez pas avoir afoobar et aFooBaz tant qu’entités indépendantes.

Cette limitation absurde (qui devait s’adapter aux anciens linkers) n’est plus pertinente pour aucun environnement. La norme C99 propose 31 caractères sensibles à la casse pour les noms externes et 63 en interne, et les lieurs couramment utilisés prennent en charge des noms beaucoup plus longs.

Cela signifie simplement que si vous avez deux variables nommées

abcdefghijklmnopqrstuvwxyz78901A ,

et

abcdefghijklmnopqrstuvwxyz78901B ,

qu’il n’y a aucune garantie qui sera traitée comme des variables différentes, séparées …

Cela signifie que :

 foobar1 foobar2 

peut être le même nom externe, car seuls les 6 premiers caractères doivent être pris en compte. La casse simple signifie que les noms majuscules et minuscules ne doivent pas être distingués.

Veuillez noter que presque tous les linkers modernes considéreront des noms beaucoup plus longs, mais qu’il y aura toujours une limite, dépendant de l’éditeur de liens.

G’day

L’un des problèmes avec cette résolution de symbole limitée se produit au moment de la liaison.

Plusieurs symboles portant le même nom peuvent exister dans plusieurs bibliothèques et l’éditeur de liens n’utilise en général que le premier qu’il trouve correspondant à ce qu’il recherche.

Ainsi, en utilisant l’exemple de S.Lott ci-dessus, si votre éditeur de liens recherche le symbole “a_very_long_name” et trouve une bibliothèque sur son chemin de recherche contenant le symbole “a_very_long_name_thats_too_similar”, il prend celui-ci. Cela se produira même si la bibliothèque contenant le symbole souhaité, c’est-à-dire “a_very_long_name” a été spécifiée dans votre commande. Par exemple, en spécifiant les bibliothèques comme:

 -L/my/library/path -lmy_wrong_lib -lmy_correct_lib 

Il existe maintenant des options de compilateur, ou plus correctement des options de temps de compilation, qui sont transmises à l’éditeur de liens, qui imposent une recherche de plusieurs symboles dans votre chemin de liens. Celles-ci sont alors généralement générées comme des erreurs au moment de la liaison.

En outre, de nombreux compilateurs, par exemple gcc, adopteront ce comportement par défaut. Vous devez activer explicitement plusieurs définitions pour permettre à l’éditeur de liens de continuer sans générer d’erreur fatale s’il trouve plusieurs définitions pour un symbole.

BTW, je vous recommande vivement de travailler sur les exercices en conjonction avec le livre de Clovis Tondo ” The C Answer Book 2nd ed. “.

Faire cela aide vraiment à faire en sorte que C rest dans votre esprit.

HTH

à votre santé,