3 pytania dotyczące extern wykorzystywanego w projekcie Objective-C
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 ?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".
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
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;
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.
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"
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