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

Ran*_*eis 6 c compatibility objective-c superset

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

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

#import <stdio.h>

int main () {
    char *nil = "hello";
    printf("%s\n",nil);
}
Run Code Online (Sandbox Code Playgroud)

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

bbu*_*bum 14

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

#ifndef nil
#define nil __DARWIN_NULL   /* id of Nil instance */
#endif
Run Code Online (Sandbox Code Playgroud)

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

显然,分裂的头发.不过,你真的可以编译Objective-C源代码nil.

它类似于问"我可以编写一个deflate在仍然使用zlib.h接口的情况下命名变量的工具吗?".当然.但它会很难看.

而且,事实上,该编译器不会自动包括objc.h.这个:

#include <stdio.h>

int main() {
    int nil = 5;
    fprintf(stdout, "Hello %d\n", nil);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 编译器不会自动包含它. (2认同)