3 pytania dotyczące extern wykorzystywanego w projekcie Objective-C

  1. Kiedy używam słowa extern przed deklaracją metody lub zmiennej, czy czynię je globalnym, a zatem czytelnym/zapisywalnym / użytecznym w całym projekcie ?

  2. Jeśli używam extern przed słowem kluczowym, czy jest szansa, że nadal nie jest dostępny przez część mojego projektu ? Na przykład, tylko przez podklasy.. na przykład kiedy używam "protected".

  3. extern to słowo kluczowe C, prawda? Czy istnieje odpowiednik w Objective-C? Właściwie to nie rozumiem dlaczego używają C słowo kluczowe w projekcie Objective-C.

Dzięki

Author: rounak, 2011-09-07

3 answers

1) określasz jego powiązanie. extern linkage pozwala Tobie lub dowolnemu klientowi odwoływać się do symbolu.

Odnośnie zmiennych globalnych: jeżeli zmienna jest zmienna i / lub wymaga odpowiedniej konstrukcji, wtedy należy rozważyć metody lub funkcje dla tego obiektu. wyjątkiem od tego są stałe NSString:

// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";

2) nie ma przypadku, gdy słowo kluczowe extern wpływa na widoczność (public/protected/private / package). aby użyć symbolu (np. stałej lub funkcji C), po prostu dołącz nagłówek, w którym jest zadeklarowany.

Nieco mylące, jeśli jesteś nowy w języku: umieszczenie deklaracji extern C (stałych, funkcji) pomiędzy @interface ... @end nie zmieni jego zakresu:

@interface MONClass : NSObject

extern const size_t MaximumThreads;

@end

Ma ten sam zakres (globalny) i widoczność (publiczny) jak:

@interface MONClass : NSObject

@end

extern const size_t MaximumThreads;

Więc nie ma sensu umieszczać stałych lub funkcji C związanych z klasą w @interface...@end i @implementation...@end. polecam umieszczenie ich w tym samym nagłówku co interfejs, poza @interface/@end i @implementation/@end i przedrostek nazwy z klasą, z którą jest skojarzona, w ten sposób:

@interface MONClass : NSObject

@end

extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;

I jeśli chcesz, aby stała była prywatna, po prostu zadeklaruj i zdefiniuj ją w następujący sposób:

// MONClass.m
static const size_t MONClassMaximumThreads = 23;

@implementation MONClass

@end

Niestety, nie ma równie prostego lub powszechnego sposobu, aby stała ta była chroniona za pomocą objc.

Wreszcie, możesz również użyć metod klasy, jeśli liczba powinna się różnić w zależności od klasy:

@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end

@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end

3) tak, wśród innych języków. na przykład, jeśli używasz extern const int Something W tłumaczeniu c++, c++ tłumaczenie będzie szukało Something zadeklarowanego jako symbol extern C++. nie ma podstawienia w objc; objc jest supersetem C i dziedziczy wszystkie funkcje C. użycie extern jest dobrze uformowane i można je również znaleźć w używanych frameworkach(np. Fundacji). używają go, ponieważ muszą określić powiązanie. objc nie oferuje zamiennika, prawdopodobnie dlatego, że nie wymagał wymiany lub rozszerzenia.

Aby tego uniknąć, po prostu użyj #define W ten sposób:

#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif

MONExternC const size_t MONClassMaximumThreads;
 38
Author: justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 21:11:33

extern nie oznacza "globalny" , oznacza "zdefiniowany gdzie indziej". Jest on używany do poinformowania kompilatora, że zmienna lub funkcja istnieje (w innym pliku obiektowym lub bibliotece), aby nie narzekał na nią i że linker zostanie dostarczony z tym plikiem obiektowym lub biblioteką.

W konsekwencji extern oznacza, że element docelowy jest globalny.

Objective-C jest tylko supersetem C. wszystko, co jest dostępne w C, jest również dostępne w Objective-C, z tą samą składnią i semantyczne. Nie ma konstrukcji C, która jest zdefiniowana w inny sposób w Objective-C.

 17
Author: mouviciel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-07 07:21:34

Punkt 3: Tak możesz użyć FOUNDATION_EXPORT w objective C, który jest makrem, które rozwiązuje się na różne słowa kluczowe w zależności od kompilacji C lub C++

Więcej informacji tutaj na temat różnic: "FOUNDATION_EXPORT" vs "extern"

 0
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:04