Действительно ли объективный C 2.0 является надлежащим надмножеством C?

Я услышал, что цель-C является надлежащим надмножеством C, но объективна-C 2.0?

Причина, которую я спрашиваю, состоит в том, что или это не, или я неправильно понимаю фразу 'надлежащее надмножество', потому что этот код является допустимым синтаксисом C:

#import <stdio.h>

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

Но не компилирует в Objective C 2.0. Очевидно, это - легко закрепляемая проблема, но я пишу работу и чувствую, что это - что-то, на что нужно указать.

6
задан Matthew Flaschen 3 June 2010 в 07:26
поделиться

2 ответа

nil не является ключевым словом. nil определен в objc.h [на Mac OS X] (а __DARWIN_NULL на самом деле просто NULL):

#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 tool (в main.m), как только вы удалите прекомпилированный/prefix заголовок, который импортирует Foundation и, следовательно, objc.h. (Итак, да, из коробки, шаблоны Xcode do заставляют objc.h импортироваться путем импорта Cocoa/Cocoa.h или Foundation/Foundation.h)

.
14
ответ дан 8 December 2019 в 13:44
поделиться

Objective-C надлежащий надмножество C, так как все, что работает в C, будет работать с Objective-C.

НО,

так как это расширенный набор, он добавляет несколько новых типов, определений и директив .

Это означает, что если вы используете зарезервированное определение, например nil , вы попадете в серьезные проблемы.

Вот почему указанная выше программа не компилируется.

3
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: