Подтвердить что ты не робот

Разница между typeof, __typeof и __typeof__ в Objective-C

В Objective-C я часто использую __typeof__(obj) при работе с блоками и т.д. Почему бы не __typeof(obj) или typeof(obj).

Когда использовать что?

4b9b3361

Ответ 1

__typeof__() и __typeof() являются расширениями, специфичными для компилятора, для языка C, поскольку стандарт C не включает такой оператор. Стандарт C требует, чтобы компиляторы использовали префикс языковых расширений с двойным подчеркиванием (и поэтому вы никогда не должны делать этого для своих собственных функций, переменных и т.д.).

typeof() - это точно то же самое, но выделяет подчеркивания из окна с пониманием того, что каждый современный компилятор поддерживает его. (На самом деле, теперь, когда я думаю об этом, Visual С++ может и не быть. Он поддерживает decltype(), хотя, как правило, имеет такое же поведение, как typeof().)

Все три означают одно и то же, но ни один из них не является стандартным C, поэтому соответствующий компилятор может выбрать любое другое значение.

Ответ 2

Как уже упоминалось, typeof() является расширением C, который имеет различную поддержку в соответствующих компиляторах.
Если вы пишете Objective-C для приложений iOS или Mac, есть вероятность, что вы будете компилировать ваше приложение с помощью компилятора Clang.

Clang поддерживает использование typeof(), но технически это для того, когда ваш языковой диалект C задан как тип gnu *. Однако __typeof__() поддерживается как в диалоговом языке c *, так и в gnu *, как описано в Clang документация.

Теперь, если вы пишете свой код с помощью Xcode, по умолчанию для диалекта языка C отображается GNU99, а опция разрешения 'asm' 'inline' 'typeof' установлена ​​на Да, поэтому использование typeof() не вызовет никаких проблем.

Xcode project settings

Если вы хотите быть (возможно) безопаснее при использовании компилятора Clang, используйте __typeof__(). Таким образом, вы не будете затронуты, если C Language Dialect используется для компиляции, или если кто-то решит отключить учетную запись 'typeof'.

Ответ 3

Надеюсь, это будет полезно:

-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