tesis sistemas sistema proyecto propuesta para organizar implementacion gestion ejemplos documentos documental archivo c objective-c arrays static const

proyecto - sistemas de gestion documental ejemplos



Conjunto variable modificado en el alcance del archivo (6)

Quiero crear una matriz estática constante para usar en todo mi archivo de implementación de Objective-C similar a algo así en el nivel superior de mi archivo ".m":

static const int NUM_TYPES = 4; static int types[NUM_TYPES] = { 1, 2, 3, 4 };

Planeo usar NUM_TYPES más adelante en el archivo, así que quería ponerlo en una variable.

Sin embargo, cuando hago esto, obtengo el error

"Tipos" modificados de forma variable en el alcance del archivo "

Supongo que esto puede tener algo que ver con que el tamaño de matriz sea una variable (no obtengo este mensaje cuando pongo un entero literal allí, como static int types[4] ).

Quiero arreglar esto, pero tal vez estoy haciendo todo mal ... Tengo 2 objetivos aquí:

  1. Para tener una matriz que es accesible a través del archivo
  2. Para encapsular NUM_TYPES en una variable, no tengo el mismo literal disperso sobre diferentes lugares en mi archivo

¿Alguna sugerencia?

[EDIT] Encontró esto en C Faq: http://c-faq.com/ansi/constasconst.html


Como ya se explicó en otras respuestas, const en C simplemente significa que una variable es de solo lectura. Todavía es un valor de tiempo de ejecución. Sin embargo, puedes usar una enum como una constante real en C:

enum { NUM_TYPES = 4 }; static int types[NUM_TYPES] = { 1, 2, 3, 4 };



Imho esto es un defecto en muchos compiladores de c. Sé con certeza que los compiladores con los que trabajé no almacenan una variable "static const" en una dirección, sino que reemplazan el uso en el código por la constante. Esto puede verificarse ya que obtendrá la misma suma de comprobación para el código producido cuando use una directiva predefinidos #define y cuando use una variable estática const.

De cualquier manera, debe usar variables estáticas const en lugar de #defines siempre que sea posible, ya que la constante estática es segura.


Si va a utilizar el preprocesador de todos modos, según las otras respuestas, puede hacer que el compilador determine NUM_TYPES el valor de NUM_TYPES :

#define NUM_TYPES (sizeof types / sizeof types[0]) static int types[] = { 1, 2, 3, 4 };


También es posible usar la enumeración.

typedef enum { typeNo1 = 1, typeNo2, typeNo3, typeNo4, NumOfTypes = typeNo4 } TypeOfSomething;


#define NUM_TYPES 4