在objective-c中,我经常__typeof__(obj)在处理块等时使用.为什么不__typeof(obj)或typeof(obj).
什么时候用哪个?
Jon*_*pan 55
__typeof__()并且__typeof()是C语言的特定于编译器的扩展,因为标准C不包括这样的运算符.标准C要求编译器使用双下划线为语言扩展添加前缀(这也是您不应该为自己的函数,变量等执行此操作的原因)
typeof()是完全相同的,但是将下划线抛出窗口,理解每个现代编译器都支持它.(实际上,现在我考虑一下,Visual C++可能没有.它确实支持decltype(),它通常提供与之相同的行为typeof().)
所有三个都意味着相同的东西,但没有一个是标准的C,所以符合标准的编译器可以选择使任何意思有所不同.
Mul*_*xel 30
正如其他人所提到的,typeof()是C的扩展,在各自的编译器中有各种支持.
如果您正在为iOS或Mac应用程序编写Objective-C,那么您很可能会使用Clang编译器编译您的应用程序.
Clang确实支持使用typeof(),但从技术上讲,它适用于将C语言方言设置为gnu*类型的情况.但是__typeof__()支持两个C*和GNU*语言方言-作为锵中详细文档.
现在如果您使用Xcode编写代码,C语言方言的默认设置似乎是GNU99,允许'asm''内联''typeof'的选项设置为Yes,因此使用typeof()不会带来任何问题.

如果您希望在使用Clang编译器时(可以说)更安全,请使用__typeof__().这样,如果用于编译的C语言方言发生变化,或者某人决定关闭'typeof'的限额,您将不会受到影响.
希望这会有所帮助:
-ansi和各种-std选项禁用某些关键字。当您要使用GNU C扩展名或应由所有程序(包括ISO C程序)使用的通用头文件时,这会引起麻烦。关键字asm,typeof和inline在使用-ansi或-std编译的程序中不可用(尽管可以在使用-std = c99或-std = c11编译的程序中使用inline)。仅当使用-std = gnu99(最终将是默认设置)或-std = c99(或等效的-std = iso9899:1999)或更高版本的标准选项时,ISO C99关键字限制才可用。
解决这些问题的方法是在每个有问题的关键字的开头和结尾加上“ __”。例如,使用__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