Подтвердить что ты не робот

Цель C - почему константы начинаются с k

Почему константы во всех примерах, которые я видел, всегда начинаются с k? И я должен #define константы в заголовке или .m файле?

Я новичок в Objective C, и я не знаю C. Есть ли какой-то учебник где-нибудь, который объясняет эти вещи, не предполагая знания C?

4b9b3361

Ответ 1

Исходные константы с "k" являются наследием пред-Mac OS X дней. На самом деле, я думаю, что эта практика может произойти еще в тот день, когда Mac OS была написана в основном в Pascal, а основным языком разработки был Pascal. В C, #define 'd константы обычно записываются во ВСЕХ CAPS, а не в префиксах с помощью "k".

Как для где #define константы: #define их, где вы собираетесь их использовать. Если вы ожидаете, что люди, которые #import используют ваш код для использования констант, поместите их в файл заголовка; если константы будут использоваться только внутри, поместите их в файл .m.

Ответ 3

Вопрос о том, что означает "k", отвечает в этом вопросе.

И если вы собираетесь использовать файлы, отличные от этого конкретного .m, использовать эти константы, вы должны поместить константы в заголовок, так как они не могут импортировать файл .m.

Вас может заинтересовать Cocoa Dev Central C учебник для Cocoa программистов. Это объясняет многие основные понятия.

Ответ 4

k для "konvention". Шутки в сторону; это просто соглашение.

Вы можете поместить #define везде, где захотите; в заголовке, в .m вверху, в .m рядом с тем, где вы его используете. Просто поставьте его перед любым кодом, который его использует.

Документация "intro to objective-c", поставляемая с набором инструментов Xcode, на самом деле неплоха. Прочитайте его несколько раз (мне нравится перечитывать его каждые 2-5 лет).

Однако ни то, ни другое из книг, которые я знаю, не будут отвечать на эти конкретные вопросы. Ответы становятся очевидными благодаря опыту.

Ответ 5

Я считаю, что это из-за прежней распространенности венгерской нотации, поэтому k был выбран потому, что c означал характер. (http://en.wikipedia.org/wiki/Hungarian_notation)

- Алан

Ответ 6

Префикс k происходит от времени, когда многие разработчики любили использовать венгерскую нотацию в своем коде. В венгерской нотации каждая переменная имеет префикс, который сообщает вам, какой тип он есть. pSize будет указателем с именем "размер", тогда как iSize будет целым числом с именем "размер". Просто глядя на имя, вы знаете тип переменной. Это может быть очень полезно в отсутствие современных IDE, которые могут показать вам тип любой переменной в любое время, иначе вам всегда придется искать объявление, чтобы знать его. Следуя тенденции времени, Apple хотела иметь общий префикс для всех констант.

Хорошо, почему бы не c, тогда, как c для "константы"? Поскольку c уже был принят, в венгерской нотации c для "счетчика" (cApple означает "количество яблок" ). Аналогичная проблема с class, являющейся ключевым словом на многих языках, так как вы называете переменную, указывающую на класс? Вы найдете множество кодов, назвавших эту переменную klass, и, таким образом, был выбран k, k как в "konstant". На многих языках это слово действительно начинается с k, см. Здесь.

Что касается вашего второго вопроса: вы не должны использовать #define для константы вообще, если вы можете избежать этого, поскольку #define является безликим.

const int x = 10;           // Type is int
const short y = 20;         // Type is short
const uint64_t z = 30;      // Type is for sure UInt64
const double d = 5000;      // Type is for sure double
const char * str = "Hello"; // Type is for sure char *

#define FOO 90

Какой тип FOO? Это какой-то номер. Но какой номер? Пока что типа типа или вообще нет. Тип будет зависеть от того, как и где вы используете FOO в своем коде.

Также, если у вас есть фиксированный набор чисел, используйте enum, так как компилятор может проверить, что вы используете допустимое значение, а значения перечисления всегда постоянны.

Если вам нужно использовать определение, не имеет значения, где вы его определяете. Заголовочные файлы - это файлы, которыми вы делитесь между несколькими файлами кода, поэтому, если вам нужно одно и то же определение более чем в одном месте, вы записываете его в файл заголовка и включаете этот заголовочный файл везде, где это определение необходимо. То, что вы пишете в файл кода, видимо только внутри этого файла кода, за исключением нестатических функций и классов Obj-C, которые по умолчанию отображаются по всему миру. Но если в заголовочном файле не объявлена ​​функция, и этот заголовочный файл включен в файл кода, в котором вы хотите использовать эту функцию, компилятор не будет знать, как выглядит эта функция (какие параметры он ожидает, какое возвращаемое значение результата), поэтому он не может проверить это и должен полагаться на то, что вы его правильно назовете (обычно это приведет к созданию предупреждения). Obj-C классы не могут быть использованы вообще, если вы не укажете текущему файлу кода, по крайней мере, что это имя является именем класса, но если вы хотите действительно что-то сделать с этим классом (кроме как просто передать его), компилятор должен знать интерфейс класса, поэтому интерфейсы переходят в заголовочные файлы (если класс используется только в текущем файле кода, писать интерфейс и реализация в файл является законным и будет работать тоже).