Esta es una pregunta para principiantes C/Objective-C :-)¿Cómo declarar mi propio CGRectZero como constante?
Supongamos que quiero un CGRectOne y un CGRectTwo constantes.
¿Cómo puedo declarar eso?
Gracias, Jérémy
Esta es una pregunta para principiantes C/Objective-C :-)¿Cómo declarar mi propio CGRectZero como constante?
Supongamos que quiero un CGRectOne y un CGRectTwo constantes.
¿Cómo puedo declarar eso?
Gracias, Jérémy
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:
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.
Algo como esto
static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f};
funciona eso? Nunca he visto esa sintaxis, y no puedo hacer que compile. –
Es una característica C99 llamada Compound Literals. – Nyx0uf
Ah, ya veo. Guay. Active el soporte C99 usando '-std = c99' en" Otros indicadores C ", y ahora también funciona para mí. –
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 }
};
La técnica utilizada aquí ha funcionado bien para mí: http://www.cocos2d-iphone.org/forum/topic/2612#post-16402
esencialmente su método extern descrito por Justin, pero proporciona un ejemplo bastante lleno.
Además, esta respuesta en StackOverflow es un buen ejemplo también: Constants in Objective-C
nota: técnicamente, tiene más opciones con C++ - respondí como si la pregunta fuera c/objc. – justin
¡Gracias increíbles! – jchatard
Esto me ayudó mucho. Buena respuesta. –