在Objective中,我在处理块等时经常使用__typeof__(obj),为什么不使用__typeof(obj)或typeof(obj)。
什么时候用哪种?
发布于 2013-02-14 15:33:38
__typeof__()和__typeof()是C语言的编译器专用扩展,因为标准C不包括这样的运算符。标准C要求编译器在语言扩展前加上双下划线(这也是为什么您不应该为自己的函数、变量等做前缀)。
typeof()完全相同,但是抛出下划线时,每个现代编译器都支持它。(实际上,现在我考虑一下,VisualC++可能不会。不过,它确实支持decltype(),它通常提供与typeof()相同的行为。)
这三个都意味着相同的事情,但没有一个是标准C,所以符合标准的编译器可能会选择使任何意义不同。
发布于 2014-12-16 15:41:27
正如其他人所提到的,typeof()是C的扩展,在各自的编译器中具有不同的支持。
如果您正在为iOS或Mac应用程序编写Objective,那么您很可能会使用Clang编译器编译您的应用程序。
Clang确实支持typeof()的使用,但从技术上讲,它是用于C语言方言设置为gnu*类型时使用的。但是,__typeof__()在c*和gnu*语言方言中都受到支持--如Clang 文档中详细介绍的那样。
现在,如果使用Xcode编写代码,C语言方言的默认设置似乎是GNU99,允许'asm‘内联’‘typeof of’的选项设置为Yes,因此使用typeof()不会给您带来任何问题。

如果您希望(可以说)在使用Clang编译器时更安全,请使用__typeof__()。这样,如果用于编译的C语言方言发生了更改,或者有人决定关闭‘typeof of’,您就不会受到影响。
发布于 2013-06-17 20:57:52
希望这会有所帮助:
-ansi和各种-std选项禁用某些关键字。当您想要使用GNU C扩展或通用的头文件时,这会引起麻烦,所有程序,包括ISO C程序都应该可以使用它。在用-ansi或-std编译的程序中不能使用关键字asm、typeof和inline (尽管内联可以在用-std=c99或-std=c11编译的程序中使用)。只有在使用了C99 (最终将是默认的)或-std=c99 (或等效的-std=iso9899:1999)或以后的标准版本的选项时,才能使用ISO -std=c99关键字限制。 解决这些问题的方法是将‘__’放在每个问题关键字的开头和结尾。例如,使用__asm__代替asm,使用__inline__代替内联。
http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords
https://clang.llvm.org/docs/UsersManual.html#c-language-features
https://stackoverflow.com/questions/14877415
复制相似问题