Рассмотрим следующий исходный файл, который является (по крайней мере, допустимым) C.
void id() {
}
Я пытаюсь скомпилировать его с gcc -c test.m
, но получаю следующую ошибку:
test.m:1: error: ‘id’ redeclared as different kind of symbol
<built-in>:0: error: previous declaration of ‘id’ was here
Если бы Obj-C был строгим надмножеством, разве это не означало бы, что все действительные программы на C также являются действительными программами Obj-C? Обратите внимание, что я ничего не #import
, и я не связываюсь.
Конечно, возможно LLVM (1) делает что-то магическое по умолчанию, или, возможно, это ошибка в нем.
(1): i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (на основе Apple Inc., сборка 5658) (сборка LLVM 2336.1.00)
РЕДАКТИРОВАТЬ : Позвольте мне уточнить этот вопрос - вопрос не о части id
, я знаю, что она имеет особое значение. Моя точка зрения заключается в том, что обычно говорят, что Obj-C является строгим надмножеством C. Однако этого не может быть, если у него есть ключевых слов , которые конфликтуют с действительными программами на Си.
Так что либо id не зарезервирован компилятором, либо Obj-C не является строгим надмножеством. Смысл этого вопроса в том, чтобы спросить, в чем дело, или есть что-то очевидное, чего мне не хватает.