Является ли цель C 2.0 правильным надмножеством C? - PullRequest
6 голосов
/ 03 июня 2010

Я слышал, что target-C - это правильный расширенный набор C, но есть ли цель-C 2.0?

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

#import <stdio.h>

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

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

Ответы [ 2 ]

14 голосов
/ 03 июня 2010

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

3 голосов
/ 03 июня 2010

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

НО

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...