typeof,__typeof和__typeof__(Objective-c)之间的区别

在Objective-C中,我经常在处理块等时使用__typeof__(obj) 。为什么不使用__typeof(obj)typeof(obj)

什么时候用哪个?

__typeof__()__typeof()是C语言编译器特定的扩展,因为标准C不包含这样的运算符。 标准C要求编译器用双下划线来加前缀语言扩展(这也是为什么你不应该为自己的函数,variables等做这些)

typeof()是完全一样的,但是把每个现代编译器都支持它的理解抛出窗口。 (实际上,现在我想到了,Visual C ++可能不支持decltype() ,它通常提供与typeof()相同的行为。

所有这三个意思是相同的,但没有一个是标准的C,所以符合标准的编译器可以select使任何不同的意思。

正如其他人所说的, typeof()C的扩展,在各个编译器中有不同的支持。
如果您碰巧正在为iOS或Mac应用程序编写Objective-C,那么您很可能会用Clang编译器编译您的应用程序。

Clang确实支持使用typeof() ,但是从技术上来说,这是因为当你的C语言方言被设置为gnu *types的时候。 但是,在c *gnu *语言方面都支持__typeof__() ,详见Clang 文档 。

现在,如果您使用Xcode编写代码,C语言方言的默认设置看起来是GNU99,并且允许“asm”inline“typeof”的选项设置为Yes ,所以使用typeof()将不会给你带来任何问题

Xcode项目设置

如果你想在使用Clang编译器时更安全一些,可以使用__typeof__() 。 这样,如果C语言方言被用于编译,或者如果有人决定closures“typeof”的限制,你将不会受到影响。

希望这将是有益的:

-ansi和各种-std选项禁用某些关键字。 当您想要使用GNU C扩展或者所有程序都可以使用的通用头文件(包括ISO C程序)时,这会造成麻烦。 关键字asm,typeof和inline在用-ansi或-std编译的程序中不可用(尽pipein-line可以在用-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