在objective-c中,我经常在处理块等时使用__typeof__(obj)
。为什么不__typeof(obj)
或typeof(obj)
。
何时使用?
答案 0 :(得分:51)
__typeof__()
和__typeof()
是C语言的特定于编译器的扩展,因为标准C不包含这样的运算符。标准C要求编译器使用双下划线为语言扩展添加前缀(这也是您不应该为自己的函数,变量等执行此操作的原因。)
typeof()
完全相同,但会将下划线抛出窗口,并了解每个现代编译器都支持它。 (实际上,现在我考虑一下,Visual C ++可能没有。它确实支持decltype()
,它通常提供与typeof()
相同的行为。)
这三个意思都是一样的,但没有一个是标准的C,所以一个符合标准的编译器可能会选择做出任何不同的意思。
答案 1 :(得分:28)
正如其他人所提到的,typeof()
是 C 的扩展,在各个编译器中有各种支持。
如果您正在为iOS或Mac应用程序编写Objective-C,那么您很可能会使用 Clang 编译器编译您的应用程序。
Clang确实支持typeof()
的使用,但从技术角度来说,当您的C语言方言设置为 gnu * 类型时。但是, c * 和 gnu * 语言方言均支持__typeof__()
- 详见Clang documentation。
现在,如果您使用Xcode编写代码,C语言方言的默认设置似乎是GNU99,并允许' asm' '直列' ' typeof' 设置为是,因此使用typeof()
不会给您带来任何问题。
如果您希望在使用Clang编译器时(可以说)更安全,请使用__typeof__()
。这样,如果用于编辑的C语言方言发生变化,或者有人决定关闭' typeof' 的限额,您将不会受到影响。
答案 2 :(得分:4)
希望这会有所帮助:
-ansi和各种-std选项会禁用某些关键字。当您想要使用GNU C扩展或所有程序(包括ISO C程序)都可以使用的通用头文件时,这会导致麻烦。关键字asm,typeof和inline在使用-ansi或-std编译的程序中不可用(尽管内联可以在使用-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