考虑以下源文件,(至少应该是)有效的C。
void id() {
}
我正在尝试使用gcc -c test.m
进行编译,但是我收到以下错误:
test.m:1: error: ‘id’ redeclared as different kind of symbol
<built-in>:0: error: previous declaration of ‘id’ was here
如果Obj-C是一个严格的超集,那么这不是说所有有效的C程序也是有效的Obj-C程序吗?请注意,我不是#import
任何东西,也不是我的链接。
当然,也许LLVM(1)默认做了一些神奇的事情,或者这可能是一个错误。
(1):i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.1.00)
编辑:让我澄清这个问题 - 问题不在于id
部分,我知道它有特殊意义。我的观点是,人们普遍认为Obj-C是C的严格超集。但是,如果关键字与有效的C程序冲突,则不会出现这种情况。
因此编译器不保留 id ,或者Obj-C不是严格的超集。这个问题的关键在于询问是哪种情况,或者是否存在我遗漏的明显事实。
答案 0 :(得分:5)
Superset意味着它还增加了一些额外的功能。就像这种情况下的id
一样。它是Objective C中的一个定义类型。这些超集的extra features总是取代子集。
人们习惯使用术语严格超集。你需要带一点盐!
请参阅SO中的这些旧帖子进行类似的讨论
答案 1 :(得分:0)
id
是&#34;任何类型的对象&#34;的关键字。在ObjectiveC中。在C中它可能与写作相同
void int() {
}