6

Objective-C は C の適切なスーパーセットだと聞きましたが、objective-C は 2.0 ですか?

私が尋ねる理由は、そうではないか、「適切なスーパーセット」というフレーズを誤解しているためです。このコードは有効な C 構文であるためです。

#import <stdio.h>

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

ただし、Objective-C 2.0 ではコンパイルできません。明らかに、これは簡単に修正できる問題ですが、私は論文を書いており、これは指摘すべきことだと感じています。

4

2 に答える 2

14

nilはキーワードではありません。 [Mac OS X の場合] objc.hnilで定義されています (そして実際には):__DARWIN_NULLNULL

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

つまり、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;
}

Foundation をインポートし、したがって objc.h をインポートするプリコンパイル済み/プレフィックス ヘッダーを削除すると、標準の Foundation ツール プロジェクト (main.m 内) で問題なくコンパイルおよび実行されます。(つまり、そのままで、Xcode テンプレートimportまたはによってobjc.hインポートされます。)Cocoa/Cocoa.hFoundation/Foundation.h

于 2010-06-03T07:00:25.933 に答える
3

C で機能するものはすべて Objective-C でも機能するため、Objective-C は C の適切なスーパーセットです。

しかし、

これはスーパーセットであるため、いくつかの新しいタイプ、定義、およびディレクティブが追加されます。

つまり、 のような予約済みの定義を使用すると、nil深刻な問題が発生します。

そのため、上記のプログラムはコンパイルされません。

于 2010-06-03T07:06:49.790 に答える