客观的C 2.0是C的正确超集吗?

我听说过Objective-C是C的正确超集,但是客观的C 2.0?

我问的原因是它不是,或者我误解了“正确的超集”这个短语,因为这段代码是有效的C语法:

#import  int main () { char *nil = "hello"; printf("%s\n",nil); } 

但是不能在Objective-C 2.0中编译。 显然,这是一个容易解决的问题,但我正在写一篇论文,并认为这是应该指出的。

nil不是关键字。 nilobjc.h中定义[在Mac OS X上]( __DARWIN_NULL实际上只是NULL ):

 #ifndef nil #define nil __DARWIN_NULL /* id of Nil instance */ #endif 

也就是说, nil实际上不是编译语言的一部分,而是编译过程中使用的约定,它由系统库延续。

显然,分裂的头发。 但是你真的可以在没有nil情况下编译Objective-C源代码。

它类似于询问“我是否可以在使用zlib.h接口时编写一个名为deflate变量的工具?”。 当然。 但它会很难看。

而且,实际上, 编译器不会自动包含objc.h。 这个:

 #include  int main() { int nil = 5; fprintf(stdout, "Hello %d\n", nil); return 0; } 

一旦删除导入Foundation的预编译/前缀头,因此在标准的Foundation工具项目(在main.m中)中编译并运行得很好,因此,objc.h。 (所以,是的,开箱即用,Xcode模板确实导致通过导入Cocoa/Cocoa.hFoundation/Foundation.h导入Cocoa/Cocoa.h

Objective-C是C的正确超集,因为在C中工作的所有东西都可以使用Objective-C。

但,

因为它是一个超集,它增加了一些新的类型,定义和指令 。

这意味着如果您使用像nil这样的保留定义,那么您将遇到严重问题。

这就是上述程序无法编译的原因。