Objective-C에서 typeof, __typeof 및 __typeof__의 차이점
오브젝티브 C I에서 자주 사용하는 __typeof__(obj)
블록 등 왜 다룰 때 __typeof(obj)
나 typeof(obj)
.
언제 사용합니까?
__typeof__()
및 __typeof()
표준 C는 이러한 연산자를 포함하지 않기 때문에 C 언어와 컴파일러 고유의 확장이다. 표준 C에서는 컴파일러가 언어 확장에 이중 밑줄을 접두사로 지정해야합니다 (이는 자체 함수, 변수 등에 대해 이렇게하면 안되는 이유이기도합니다).
typeof()
정확히 동일하지만 모든 최신 컴파일러가 지원한다는 이해와 함께 밑줄을 창 밖으로 내 보냅니다. (실제로 생각해 보면 Visual C ++는 그렇지 않을 수도 있습니다. decltype()
하지만 일반적으로 typeof()
.) 와 동일한 동작을 제공하는 지원 합니다 .
세 가지 모두 동일한 것을 의미하지만 표준 C는 없으므로 준수 컴파일러는 다른 의미로 만들 수 있습니다.
다른 사람들이 언급했듯이 각 컴파일러에서 다양한 지원을 제공하는 Ctypeof()
의 확장입니다 . iOS 또는 Mac 앱용 Objective-C를 작성하는 경우 Clang 컴파일러로 앱을 컴파일 할 가능성이 높습니다 .
Clang은의 사용을 지원 typeof()
하지만 기술적으로는 C 언어 방언이 gnu * 유형으로 설정된 경우입니다. 그러나 Clang 문서에 자세히 설명 된대로 c * 및 gnu * 언어 방언 __typeof__()
모두에서 지원됩니다 .
이제 Xcode로 코드를 작성하는 경우 C 언어 방언의 기본 설정은 GNU99로 표시되고 'asm' 'inline' 'typeof' 허용 옵션이 Yes 로 설정되어 있으므로 사용 typeof()
하면 아무 것도 가져 오지 않습니다. 문제.
당신은 (싶은 경우에 틀림없이 사용을 연타 컴파일러를 사용하는 경우) 안전 __typeof__()
. 이렇게하면 컴파일에 사용되는 C 언어 방언이 변경되거나 누군가가 'typeof' 허용을 해제하기로 결정하더라도 영향을받지 않습니다 .
이것이 도움이되기를 바랍니다.
-ansi 및 다양한 -std 옵션은 특정 키워드를 비활성화합니다. 이로 인해 GNU C 확장 또는 ISO C 프로그램을 포함한 모든 프로그램에서 사용할 수 있어야하는 범용 헤더 파일을 사용하려는 경우 문제가 발생합니다. 키워드 asm, typeof 및 inline은 -ansi 또는 -std로 컴파일 된 프로그램에서 사용할 수 없습니다 (인라인은 -std = c99 또는 -std = c11로 컴파일 된 프로그램에서 사용할 수 있음). ISO C99 키워드 제한은 -std = gnu99 (결국 기본값이 됨) 또는 -std = c99 (또는 동등한 -std = iso9899 : 1999) 또는 이후 표준 버전에 대한 옵션이 사용되는 경우에만 사용할 수 있습니다.
이러한 문제를 해결하는 방법은 문제가있는 각 키워드의 시작과 끝에 '__'를 입력하는 것입니다. 예를 들어 asm 대신 __asm__을 사용하고 인라인 대신 __inline__을 사용합니다.
http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords
https://clang.llvm.org/docs/UsersManual.html#c-language-features
'developer tip' 카테고리의 다른 글
Scala에서 기호를 사용하는 실용적인 예? (0) | 2020.11.28 |
---|---|
개미로 번들 항아리 만들기 (0) | 2020.11.28 |
요소 유형의 하위가 아닌 CSS 선택자? (0) | 2020.11.28 |
웹 페이지의 특정 부분에 연결 (0) | 2020.11.28 |
.SVG 브라우저 지원 (0) | 2020.11.27 |