Confond sur l'exactitude de const avec un tableau statique de pointeurs sur des objets const
-
06-07-2019 - |
Question
Je ne suis toujours pas sûr d’avoir totalement compris comment ce cas particulier devrait aboutir. Donc, si je veux déclarer un tableau de NSStrings qui ne changera pas, est-ce correct?
static NSString * const strings[] = {@"String 1", @"String 2", ...};
Le statique
est-il nécessaire? (que fait-il?) Me manque-t-il un extra const
quelque part? Il y a trop d'endroits où aller! Gah! Est-ce que je me trompe ou est-ce que je suis juste paranoïaque?
La solution
Ce que vous avez:
static NSString * const strings[] = {@"String 1", @"String 2", ...};
Est un tableau de pointeurs immuables.
Vous voudrez peut-être:
static NSString const *strings[] = {@"String 1", @"String 2", ...};
Un tableau de pointeurs sur les objets NSString
immuables.
Ou
static NSString const * const strings[] = {@"String 1", @"String 2", ...};
Un tableau de pointeurs immuables vers des objets NSString
immuables.
La "Règle Clockwise-Spiral" est la technique que j'utilise pour interpréter les déclarations en C.
Le mot clé static
signifie que la "durée de stockage" du tableau correspond à toute la durée de vie du programme. Si la déclaration est dans une fonction, le tableau ne disparaît pas lorsque la fonction est renvoyée (bien que l'étendue ne le soit toujours que pour cette fonction). Si la déclaration est à la portée du fichier, le mot clé static
rendra le nom du tableau visible uniquement dans cette unité de compilation (c'est-à-dire, le fichier source). Un autre fichier source n'a pas pu accéder au tableau via une déclaration extern
.
Autres conseils
Vous lisez les déclarations en C de l'intérieur, en commençant par les opérateurs fortement liés comme [], puis en les déplaçant vers la gauche. Donc, vous avez: des chaînes, un tableau, une constante, des pointeurs, vers NSString, qui est statique.
C'est parfaitement raisonnable, mais pas ce que vous avez dit que vous vouliez.
Pour créer des pointeurs sur des chaînes constantes, vous aurez besoin du const
situé de l'autre côté du *
. Vous aurez ainsi des chaînes, un tableau, des pointeurs à constants. , NSString, qui sont statiques.
Vous pouvez mettre const
aux deux endroits, si vous le souhaitez.
Utiliser la classe de stockage static
revient un peu à définir une variable de classe. Identique à static
en C99, une étendue lexicale au niveau du module.