В Objective-C я часто использую __typeof__(obj)
при работе с блоками и т.д. Почему бы не __typeof(obj)
или typeof(obj)
.
Когда использовать что?
В Objective-C я часто использую __typeof__(obj)
при работе с блоками и т.д. Почему бы не __typeof(obj)
или typeof(obj)
.
Когда использовать что?
__typeof__()
и __typeof()
являются расширениями, специфичными для компилятора, для языка C, поскольку стандарт C не включает такой оператор. Стандарт C требует, чтобы компиляторы использовали префикс языковых расширений с двойным подчеркиванием (и поэтому вы никогда не должны делать этого для своих собственных функций, переменных и т.д.).
typeof()
- это точно то же самое, но выделяет подчеркивания из окна с пониманием того, что каждый современный компилятор поддерживает его. (На самом деле, теперь, когда я думаю об этом, Visual С++ может и не быть. Он поддерживает decltype()
, хотя, как правило, имеет такое же поведение, как typeof()
.)
Все три означают одно и то же, но ни один из них не является стандартным C, поэтому соответствующий компилятор может выбрать любое другое значение.
Как уже упоминалось, typeof()
является расширением C, который имеет различную поддержку в соответствующих компиляторах.
Если вы пишете Objective-C для приложений iOS или Mac, есть вероятность, что вы будете компилировать ваше приложение с помощью компилятора Clang.
Clang поддерживает использование typeof()
, но технически это для того, когда ваш языковой диалект C задан как тип gnu *. Однако __typeof__()
поддерживается как в диалоговом языке c *, так и в gnu *, как описано в Clang документация.
Теперь, если вы пишете свой код с помощью Xcode, по умолчанию для диалекта языка C отображается GNU99, а опция разрешения 'asm' 'inline' 'typeof' установлена на Да, поэтому использование typeof()
не вызовет никаких проблем.
Если вы хотите быть (возможно) безопаснее при использовании компилятора Clang, используйте __typeof__()
. Таким образом, вы не будете затронуты, если C Language Dialect используется для компиляции, или если кто-то решит отключить учетную запись 'typeof'.
Надеюсь, это будет полезно:
-ansi и различные опции -std отключают определенные ключевые слова. Это вызывает проблемы, когда вы хотите использовать расширения GNU C или заголовочный файл общего назначения, который должен использоваться всеми программами, включая программы ISO C. Ключевые слова asm, typeof и inline недоступны в программах, скомпилированных с -ansi или -std (хотя inline может использоваться в программе, скомпилированной с -std = c99 или -std = c11). Ограничение по ключевому слову ISO C99 доступно только в том случае, если -std = gnu99 (который в конечном итоге будет использоваться по умолчанию) или -std = c99 (или эквивалентный -std = iso9899: 1999) или опция для более поздней стандартной версии, используется.
Способ решения этих проблем - поставить __ в начале и конце каждого проблемного ключевого слова. Например, используйте __asm__ вместо asm и __inline__ вместо inline.
http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords
https://clang.llvm.org/docs/UsersManual.html#c-language-features