To jest pytanie dla początkujących C/Objective-C :-)Jak zadeklarować własne CGRectZero jak stałą?
Powiedzmy, że chcę mieć stałe CGRectOne i CGRectTwo.
Jak mogę to zgłosić?
Dzięki, Jérémy
To jest pytanie dla początkujących C/Objective-C :-)Jak zadeklarować własne CGRectZero jak stałą?
Powiedzmy, że chcę mieć stałe CGRectOne i CGRectTwo.
Jak mogę to zgłosić?
Dzięki, Jérémy
innych odpowiedzi są w porządku - w niektórych przypadkach -.
A) oświadczenie, że static
będzie emitować kopię na tłumaczenie. To jest w porządku, jeśli jest widoczne dla dokładnie jednego tłumaczenia (tj. Jego definicja jest w pliku .m/ .c). W przeciwnym razie otrzymasz kopie w każdym tłumaczeniu, które zawiera/importuje nagłówek z definicją statyczną. Może to spowodować zawyżenie binarne, a także wzrost czasów budowania.
B) const CGRect CGRectOne = {...};
będzie emitować symbol w zakresie, w którym jest zadeklarowany. jeśli zdarzy się, że jest to nagłówek widoczny dla wielu tłumaczeń, zostaną wyświetlone błędy łącza (ponieważ CGRectOne
jest zdefiniowany wiele razy - np. raz na plik .c/ .m, który bezpośrednio lub pośrednio zawiera nagłówek, w którym stała jest zdefiniowane).
Teraz, gdy znasz już kontekst, w którym będą używane te 2 deklaracje, pozwól, aby obejmował on sposób extern
. extern
sposób pozwala na:
Podejście extern
jest idealny do ponownego użycia stałej wśród wielu plików. Oto przykład:
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 } };
Uwaga: pomijając const
byłoby po prostu zrobić to zmienna globalna.
coś takiego
static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f};
Czy to działa? Nigdy nie widziałem tej składni i nie mogę jej skompilować. –
Jest to funkcja C99 o nazwie Compound Literals. – Nyx0uf
Ah, rozumiem. Chłodny. Włączyłem obsługę C99, używając '-std = c99' w" Other C Flags ", a teraz działa również dla mnie. –
Istnieje kilka opcji. Z C89,
const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };
Z C99,
const CGRect CGRectOne = {
.origin.x = 0.0f,
.origin.y = 0.0f,
.size.width = 1.0f,
.size.height = 1.0f
};
lub
const CGRect CGRectOne = {
.origin = { .x = 0.0f, .y = 0.0f },
.size = { .width = 1.0f, .height = 1.0f }
};
Technika stosowana tutaj pracował dobrze dla mnie: http://www.cocos2d-iphone.org/forum/topic/2612#post-16402
Zasadniczo jego extern metoda opisana przez Justina, ale zapewnia to dość pełny przykład.
Również ta odpowiedź na StackOverflow stanowi dobry przykład: Constants in Objective-C
uwaga: technicznie, masz więcej opcji z C++ - odpowiedziałem, jakby pytanie było c/objc. – justin
Niesamowite dzięki! – jchatard
Bardzo mi to pomogło. Dobra odpowiedź. –