web-dev-qa-db-fra.com

Variablement modifié tableau à la portée du fichier

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:

  1. Pour avoir un tableau accessible dans tout le fichier
  2. Pour encapsuler NUM_TYPES dans une variable pour ne pas avoir le même littéral dispersé à différents endroits dans mon fichier

Aucune suggestion?

[EDIT] Trouvé ceci dans la Faq C: http://c-faq.com/ansi/constasconst.html

81
Sam

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.

60
larsr

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 };
32
caf
#define NUM_TYPES 4
21
Jim Buck

Il est également possible d'utiliser l'énumération.

typedef enum {
    typeNo1 = 1,
    typeNo2,
    typeNo3,
    typeNo4,
    NumOfTypes = typeNo4
}  TypeOfSomething;
11
Dave L Delaney

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
};
3
CygnusX1

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.

3
hans lepoeter