如果Objective C是C的严格超集,那为什么不编译呢?

时间:2012-03-30 11:12:56

标签: objective-c

考虑以下源文件,(至少应该是)有效的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不是严格的超集。这个问题的关键在于询问是哪种情况,或者是否存在我遗漏的明显事实。

2 个答案:

答案 0 :(得分:5)

Superset意味着它还增加了一些额外的功能。就像这种情况下的id一样。它是Objective C中的一个定义类型。这些超集的extra features总是取代子集。

人们习惯使用术语严格超集。你需要带一点盐!

请参阅SO中的这些旧帖子进行类似的讨论

Is objective C 2.0 a proper superset of C?

Which dialect of C is Objective-C a "strict superset" of?

答案 1 :(得分:0)

id是&#34;任何类型的对象&#34;的关键字。在ObjectiveC中。在C中它可能与写作相同

void int() {
}