2011-01-14 17 views

Respuesta

51

Las otras respuestas son bien - en algunos casos -.

A) declarándolo static emitirá una copia por traducción. Eso está bien si es visible para exactamente una traducción (es decir, su definición está en su archivo .m/ .c). De lo contrario, terminará con copias en cada traducción que incluye/importa el encabezado con la definición estática. Esto puede dar como resultado un binario inflado, así como un aumento de los tiempos de construcción.

B) const CGRect CGRectOne = {...}; emitirá un símbolo en el ámbito que está declarado. si eso resulta ser un encabezado visible para múltiples traducciones, terminará con errores de enlace (porque CGRectOne se define varias veces, por ejemplo, una vez por .c/ .m archivo que incluye directa o indirectamente el encabezado donde se encuentra la constante definido).

Ahora que conoce el contexto para usar esas 2 declaraciones en, deje que cubra la forma extern. La forma extern le permite:

  • declara la constante en una cabecera
  • utilizar la constante en muchas traducciones
  • mientras que emite exactamente una definición de la constante

El enfoque extern es ideal para reutilizar la constante entre múltiples archivos. He aquí un ejemplo:

file.h

// the declaration in the header: 
extern const CGRect CGRectOne; 

file.c/m

// the definition: 

#import "File.h" 

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } }; 

Nota: La omisión de la const acaba de hacer que una variable global.

+0

nota: técnicamente, tiene más opciones con C++ - respondí como si la pregunta fuera c/objc. – justin

+1

¡Gracias increíbles! – jchatard

+1

Esto me ayudó mucho. Buena respuesta. –

6

Algo como esto

static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f}; 
+0

funciona eso? Nunca he visto esa sintaxis, y no puedo hacer que compile. –

+0

Es una característica C99 llamada Compound Literals. – Nyx0uf

+0

Ah, ya veo. Guay. Active el soporte C99 usando '-std = c99' en" Otros indicadores C ", y ahora también funciona para mí. –

21

Hay un par de opciones. Con C89,

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } }; 

con C99,

const CGRect CGRectOne = { 
    .origin.x = 0.0f, 
    .origin.y = 0.0f, 
    .size.width = 1.0f, 
    .size.height = 1.0f 
}; 

o

const CGRect CGRectOne = { 
    .origin = { .x = 0.0f, .y = 0.0f }, 
    .size = { .width = 1.0f, .height = 1.0f } 
}; 
Cuestiones relacionadas