Je souhaite créer un tableau statique constant à utiliser dans tout mon fichier d'implémentation Objective-C similaire à quelque chose comme ceci au niveau supérieur de mon fichier ".m":
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
Je prévois d'utiliser NUM_TYPES
plus tard dans le fichier, je voulais donc le mettre dans une variable.
Cependant, quand je fais cela, j'obtiens l'erreur
"Diversement modifiés" types "à la portée du fichier"
Je suppose que cela peut avoir quelque chose à voir avec la taille du tableau étant une variable (je ne reçois pas ce message quand je mets un littéral entier, comme static int types[4]
).
Je veux résoudre ce problème, mais peut-être que j'y vais mal… J'ai deux objectifs ici:
NUM_TYPES
dans une variable pour ne pas avoir le même littéral dispersé à différents endroits dans mon fichierAucune suggestion?
[EDIT] Trouvé ceci dans la Faq C: http://c-faq.com/ansi/constasconst.html
La raison de cet avertissement est que const dans c ne signifie pas constant. Cela signifie "lecture seule". Ainsi, la valeur est stockée à une adresse mémoire et peut éventuellement être modifiée par le code machine.
Si vous voulez quand même utiliser le préprocesseur, comme indiqué dans les autres réponses, vous pouvez demander au compilateur de déterminer la valeur de NUM_TYPES
automatiquement:
#define NUM_TYPES (sizeof types / sizeof types[0])
static int types[] = {
1,
2,
3,
4 };
#define NUM_TYPES 4
Il est également possible d'utiliser l'énumération.
typedef enum {
typeNo1 = 1,
typeNo2,
typeNo3,
typeNo4,
NumOfTypes = typeNo4
} TypeOfSomething;
Comme cela a déjà été expliqué dans d'autres réponses, const
en C signifie simplement qu'une variable est en lecture seule. C'est toujours une valeur d'exécution. Cependant, vous pouvez utiliser un enum
comme une constante réelle dans C:
enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = {
1, 2, 3, 4
};
A mon avis, c'est une faille dans de nombreux compilateurs. Je sais pertinemment que les compilateurs avec lesquels j'ai travaillé ne stockent pas une variable "static const" à une adresse mais remplacent l'utilisation dans le code par la constante. Cela peut être vérifié, car vous obtiendrez la même somme de contrôle pour le code produit lorsque vous utilisez une directive de préprocesseurs #define et lorsque vous utilisez une variable const statique.
Dans les deux cas, vous devriez utiliser des variables const statiques au lieu de #defines lorsque cela est possible, car const statique est de type sûr.