2011-01-14 19 views

Odpowiedz

51

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:

  • zadeklarować stałą w nagłówku
  • używać stała się w wielu przekładach
  • emitując dokładnie jedną definicję stałej

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.

+0

uwaga: technicznie, masz więcej opcji z C++ - odpowiedziałem, jakby pytanie było c/objc. – justin

+1

Niesamowite dzięki! – jchatard

+1

Bardzo mi to pomogło. Dobra odpowiedź. –

6

coś takiego

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

Czy to działa? Nigdy nie widziałem tej składni i nie mogę jej skompilować. –

+0

Jest to funkcja C99 o nazwie Compound Literals. – Nyx0uf

+0

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. –

21

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 } 
};