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

时间:2010-06-03 06:51:46

标签: c objective-c compatibility superset

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

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

#import <stdio.h>

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

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

2 个答案:

答案 0 :(得分:14)

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

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

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

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

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

事实上,编译器不会自动包含objc.h 。这样:

#include <stdio.h>

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

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

答案 1 :(得分:3)

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

BUT,

因为它是超集,所以它添加了一些new types, definitions and directives

这意味着如果您使用nil之类的保留定义,则会遇到严重问题。

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

相关问题