Je souhaite créer un tableau statique constant à utiliser dans mon fichier d'implémentation Objective-C similaire à quelque chose comme celui-ci 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, lorsque je fais cela, j'obtiens l'erreur
"Types" modifiés de manière variable à 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 lorsque j'y mets un littéral entier, comme static int types[4]
).
Je veux résoudre ce problème, mais peut-être que je fais tout faux ... J'ai 2 objectifs ici:
- Pour avoir un tableau accessible dans tout le fichier
- Pour encapsuler
NUM_TYPES
dans une variable afin que je n'ai pas le même littéral dispersé à différents endroits dans mon fichier
Aucune suggestion?
[EDIT] J'ai trouvé ceci dans la FAQ C: http://c-faq.com/ansi/constasconst.html
#define kNUM_TYPES 4
?@"An NSString literal"
) Le seul problème avec votre morceau de code est qu'il n'y a pas besoin de point-virgule.Réponses:
La raison de cet avertissement est que const dans c ne signifie pas constante. Cela signifie «lecture seule». Ainsi, la valeur est stockée à une adresse mémoire et pourrait potentiellement être modifiée par le code machine.
la source
const
(par exemple en éloignantconst
un pointeur et en stockant une valeur) est un comportement indéfini; par conséquent, la valeur d'un tel objet est une constante de compilation ou d'exécution (en fonction de la durée de stockage). La valeur ne peut pas être utilisée dans une expression constante simplement parce que la norme C ne dit pas qu'elle peut l'être. (Le rejetconst
et le stockage d'une valeur sont autorisés si l'objet de destination est défini sansconst
ou alloué dynamiquement; les chaînes littérales ne le sont pasconst
mais ne peuvent pas être écrites.)extern
constantes dans différentes TU dont la valeur n'est pas connue lors de la compilation de la TU actuelle.Si vous allez quand même utiliser le préprocesseur, comme pour les autres réponses, vous pouvez faire en sorte que le compilateur détermine la valeur de
NUM_TYPES
automatiquement:#define NUM_TYPES (sizeof types / sizeof types[0]) static int types[] = { 1, 2, 3, 4 };
la source
sizeof
sur des objets comme celui-ci est une constante de compilation.#define NUM_TYPES 4
la source
Il est également possible d'utiliser l'énumération.
typedef enum { typeNo1 = 1, typeNo2, typeNo3, typeNo4, NumOfTypes = typeNo4 } TypeOfSomething;
la source
Comme cela est déjà expliqué dans d'autres réponses,
const
en C signifie simplement qu'une variable est en lecture seule. Il s'agit toujours d'une valeur d'exécution. Cependant, vous pouvez utiliser anenum
comme constante réelle dans C:enum { NUM_TYPES = 4 }; static int types[NUM_TYPES] = { 1, 2, 3, 4 };
la source
Imho c'est une faille dans de nombreux compilateurs c. 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 très 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 statique const.
Dans tous les cas, vous devez utiliser des variables const statiques au lieu de #defines chaque fois que possible car le const statique est de type sécurisé.
la source
static const
variable. Le comportement que vous décrivez peut être une optimisation valide, mais ce n'est certainement pas quelque chose qui pourrait toujours fonctionner.