Цель C - почему константы начинаются с k
Почему константы во всех примерах, которые я видел, всегда начинаются с k? И я должен #define константы в заголовке или .m файле?
Я новичок в Objective C, и я не знаю C. Есть ли какой-то учебник где-нибудь, который объясняет эти вещи, не предполагая знания C?
Ответы
Ответ 1
Исходные константы с "k" являются наследием пред-Mac OS X дней. На самом деле, я думаю, что эта практика может произойти еще в тот день, когда Mac OS была написана в основном в Pascal, а основным языком разработки был Pascal. В C, #define
'd константы обычно записываются во ВСЕХ CAPS, а не в префиксах с помощью "k".
Как для где #define
константы: #define
их, где вы собираетесь их использовать. Если вы ожидаете, что люди, которые #import
используют ваш код для использования констант, поместите их в файл заголовка; если константы будут использоваться только внутри, поместите их в файл .m
.
Ответ 2
Текущие рекомендации от Apple для константы именования don ' t включают префикс 'k', но многие организации приняли это соглашение и все еще используют его, поэтому вы все равно видите его довольно много.
Ответ 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 классы не могут быть использованы вообще, если вы не укажете текущему файлу кода, по крайней мере, что это имя является именем класса, но если вы хотите действительно что-то сделать с этим классом (кроме как просто передать его), компилятор должен знать интерфейс класса, поэтому интерфейсы переходят в заголовочные файлы (если класс используется только в текущем файле кода, писать интерфейс и реализация в файл является законным и будет работать тоже).