Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
目标C2.0是C的适当超集吗?_C_Objective C_Compatibility_Superset - Fatal编程技术网

目标C2.0是C的适当超集吗?

目标C2.0是C的适当超集吗?,c,objective-c,compatibility,superset,C,Objective C,Compatibility,Superset,我听说objective-C是C的超集,但objective-C是2.0吗 我询问的原因是,要么不是,要么我误解了短语“正确的超集”,因为此代码是有效的C语法: #import <stdio.h> int main () { char *nil = "hello"; printf("%s\n",nil); } #导入 int main(){ char*nil=“你好”; printf(“%s\n”,无); } 但不在Objective-C2.0中编译。显然,这是

我听说objective-C是C的超集,但objective-C是2.0吗

我询问的原因是,要么不是,要么我误解了短语“正确的超集”,因为此代码是有效的C语法:

#import <stdio.h>

int main () {
    char *nil = "hello";
    printf("%s\n",nil);
}
#导入
int main(){
char*nil=“你好”;
printf(“%s\n”,无);
}

但不在Objective-C2.0中编译。显然,这是一个很容易解决的问题,但我正在写一篇论文,觉得这是应该指出的问题。

nil
不是一个关键词
nil
是在objc.h中定义的[在Mac OS X上](
\uu DARWIN\u NULL
实际上就是
NULL
):

也就是说,
nil
实际上不是编译语言的一部分,而是编译过程中使用的一种约定,由系统库永久保存

很明显,这是一派胡言。不过,您确实可以编译Objective-C源代码,而无需
nil

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

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

#包括
int main(){
int-nil=5;
fprintf(标准输出,“你好%d\n”,无);
返回0;
}

一旦移除了导入基础的预编译/前缀标头,因此,Obj.h就可以在标准基础工具项目中编译并运行正常。(因此,是的,开箱即用,Xcode模板确实会导致通过导入
Cocoa/Cocoa.h
Foundation/Foundation.h
的方式导入
objc.h

Objective-C是C的适当超集,因为在C中工作的所有东西都将与Objective-C一起工作

但是 由于它是一个超集,它增加了一些

这意味着,如果使用像
nil
这样的保留定义,您将陷入严重的麻烦


这就是上面的程序不编译的原因。

那么你是说XCode在编译我的代码时,给了编译器一些选项,这些选项会导致定义nil?因为我确实注意到了它的定义,但我只是假设它是苹果对GNU C编译器所做修改的一部分……问题不在于你是否“可以在没有nil的情况下编译Objective-C源代码”。这是你是否可以编译有效的C,使用nil作为Objective-C。。。某个地方包含了一些东西;基金会,AppKIT,可可,什么的。IIRC,它不是编译器自动包含的(我可能错了——没有
objc.h
的Objective-C不是我考虑过的东西)。@Matthew You可以。但这将是一个彻底的麻烦,因为您将无法遵循Objective-C的标准模式和标准运行时或系统库。但是,这又不是语言问题。。。它是一个库问题。编译器不自动包含它。它编译的原因,即使你还没有包含任何Objto-C框架或运行时头,是因为你的项目可能有一个预编译的头,它包含了基础框架头(以及定义了代码> NIL的头)。它确实为我编译,使用GCC4.4和命令行
gccsomesome_file.m-osomesome_file
。因此,虽然可能有一些有效的C程序不是有效的Objective-C,但这不是一个。指出了“严格超集”神话的一个更尖锐的反例:任何使用
id
作为标识符的C程序都将无法编译为Obj-C.+1-我知道这条评论已经晚了(这是一篇老文章),但你的答案正是我所想的。如果它是一个适当的超集,它会添加子集中不存在的内容。这意味着为子集语言编写的代码在超集语言中可能会有不同的解释,甚至会抛出错误,因为您使用了保留字作为变量名。添加新的类型、定义或指令,如果这样做会导致任何以前有效的程序中断或更改其语义,将使objective-c不再是超集。当然,除非之前必须在有效的C中执行一些不可能的操作才能启用它们。
#ifndef nil
#define nil __DARWIN_NULL   /* id of Nil instance */
#endif
#include <stdio.h>

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