학습 목적으로 Reddit 클라이언트를 만들고 있습니다. 상수가있는 파일이 필요합니다. Reddit-Prefix.pch
모든 파일에서 상수를 사용할 수 있도록 파일에서 파일을 가져 오는 것에 대해 생각하고있었습니다 . 좋은 일입니까? 또한 연구를 수행하고 상수를 만드는 몇 가지 방법을 찾았지만 사용할 방법을 모르겠습니다.
#define
매크로const
static const
extern const
enum
어떤 방법이 선호 되는가? 컨벤션이란 무엇입니까? 나는 “그것이 달려있다”는 것을 알고 있지만 내 질문은 더 구체적으로 다음과 같습니다. 각 솔루션의 사용 사례는 무엇입니까?
또한를 사용하는 경우 extern const
파일을 가져와야합니까, 아니면 파일을 가져 오지 않고 전역에서 상수를 사용할 수 있습니까?
논리적으로 결론을 내릴 수있는 한 가지는 enum
사용자 정의 오류 도메인과 같은 것을 정의 할 때 최선의 선택 이라는 것 입니다 (실제로 맞습니까?). 그러나 다른 사람들은 어떻습니까?
답변
첫 번째 질문은 상수가 원하는 범위이며 실제로 두 가지 질문입니다.
- 이 상수는 단일 클래스에만 적용됩니까, 아니면 응용 프로그램 전체에 적용하는 것이 합리적입니까?
- 그들이 수업에 특화된 경우, 수업의 클라이언트 또는 수업 내에서만 사용할 수 있습니까?
그것들이 단일 클래스에 대해 구체적이고 내부적이라면 static const
, .m 파일의 맨 위에 다음과 같이 선언 하십시오.
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
이들이 단일 클래스와 관련이 있지만 다른 클래스에서 공개 / 사용해야하는 extern
경우 헤더에서와 같이 선언하고 .m에서 정의하십시오.
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
전역 적이어야하는 경우 헤더로 선언하고 해당 상수에 대해 해당 모듈에서 정의하십시오.
서로 다른 상수에 대해 원하는 전역 수준과 서로 합치 지 않는 다른 전역 상수에 대해 이들을 혼합하고 일치시킬 수 있습니다. 별도의 모듈에 각각 고유 한 헤더가있는 별도의 모듈에 넣을 수 있습니다 필요.
왜 안돼 #define
?
오래된 대답은 “매크로는 타입 정보를 가지고 있지 않다”고하지만 오늘날 컴파일러는 변수뿐만 아니라 리터럴 (매크로가 확장되는 것)에 대한 모든 타입 검사를 수행하는 것이 현명합니다.
현대의 대답은 디버거가 매크로에 대해 알지 못하기 때문입니다. 매크로 인 [myThing addObserver:self forKey:MyThingNotificationKey]
경우 디버거 명령에서 말할 수 없습니다 MyThingNotificationKey
. 디버거는 변수 인 경우에만 알 수 있습니다.
왜 안돼 enum
?
글쎄, rmaddy는 주석에서 나를 이겼습니다 : enum
정수 상수 만 정의 할 수 있습니다. 일련 식별자 번호, 비트 마스크, 4 바이트 코드 등
그러한 목적을 위해서는 enum
위대하고 절대적으로 사용해야합니다. (더 나은 사용 및 매크로를 .) 다른 것들 들어 있어야 다른 것을 사용한다; 정수 외에는 아무것도하지 않습니다.NS_ENUM
NS_OPTIONS
enum
그리고 다른 질문들
Reddit-Prefix.pch 파일에서 파일을 가져 와서 모든 파일에서 상수를 사용할 수 있도록 생각하고있었습니다. 좋은 일입니까?
아마 무해하지만 아마도 과도합니다. 상수 헤더를 필요한 곳에 가져옵니다.
각 솔루션의 사용 사례는 무엇입니까?
#define
: 꽤 제한적입니다. 솔직히 더 이상 상수에 이것을 사용해야하는 이유가 확실하지 않습니다.const
: 지역 상수에 가장 적합합니다. 또한 헤더에 선언하고 정의하고있는 것에 대해서도 이것을 사용해야합니다.static const
: 파일 별 (또는 클래스 별) 상수에 가장 적합합니다.extern const
: 헤더에서 상수를 내보낼 때 이것을 사용해야합니다.
또한를 사용하는 경우
extern const
파일을 가져와야합니까, 아니면 파일을 가져 오지 않고 전역에서 상수를 사용할 수 있습니까?
파일을 사용하는 각 파일 또는 접두사 헤더에서 파일을 가져와야합니다.
답변
FOUNDATION_EXPORT
기본적 으로 정의되어 있고 C, C ++ 및 Win32에 대해 호환 가능한 형식으로 컴파일되므로 FOUNDATION_EXPORT
약간 더 호환성을 고려하십시오 extern
.
NSObjCRuntime.h에 정의 된대로
#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif
#if TARGET_OS_WIN32
#if defined(NSBUILDINGFOUNDATION)
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllexport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllimport)
#endif
#define FOUNDATION_IMPORT FOUNDATION_EXTERN __declspec(dllimport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN
#define FOUNDATION_IMPORT FOUNDATION_EXTERN
#endif