首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标C中类型、__typeof和__typeof__的差异

目标C中类型、__typeof和__typeof__的差异
EN

Stack Overflow用户
提问于 2013-02-14 14:48:19
回答 3查看 32.2K关注 0票数 71

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

什么时候用哪种?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-14 15:33:38

__typeof__()__typeof()是C语言的编译器专用扩展,因为标准C不包括这样的运算符。标准C要求编译器在语言扩展前加上双下划线(这也是为什么您不应该为自己的函数、变量等做前缀)。

typeof()完全相同,但是抛出下划线时,每个现代编译器都支持它。(实际上,现在我考虑一下,VisualC++可能不会。不过,它确实支持decltype(),它通常提供与typeof()相同的行为。)

这三个都意味着相同的事情,但没有一个是标准C,所以符合标准的编译器可能会选择使任何意义不同。

票数 64
EN

Stack Overflow用户

发布于 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’,您就不会受到影响。

票数 32
EN

Stack Overflow用户

发布于 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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14877415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档