Цель C - Почему константы начинаются с k - PullRequest
42 голосов
/ 05 августа 2009

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

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

Ответы [ 6 ]

38 голосов
/ 05 августа 2009

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

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

9 голосов
/ 15 мая 2011

Текущие рекомендации от Apple для констант именования не включают префикс 'k', но многие организации приняли это соглашение и все еще используют его, так что вы все еще видите его довольно много.

8 голосов
/ 05 августа 2009

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

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

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

3 голосов
/ 22 ноября 2017

Префикс k происходит от того времени, когда многие разработчики любили использовать Венгерскую нотацию в своем коде. В венгерской нотации каждая переменная имеет префикс, который сообщает вам, какой это тип. pSize будет указателем с именем "size", тогда как iSize будет целым числом с именем "size". Просто глядя на имя, вы знаете тип переменной. Это может быть очень полезно в отсутствие современных 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 не могут использоваться вообще, если только вы не скажете текущему файлу кода, по крайней мере, что это имя является именем класса, но если вы действительно хотите что-то сделать с этим классом (не просто передавая его), компилятор должен знать интерфейс класса, поэтому интерфейсы входят в заголовочные файлы (если класс используется только в текущем файле кода, запись интерфейса и реализация в файл допустимы и также будут работать).

3 голосов
/ 05 августа 2009

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

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

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

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

1 голос
/ 15 мая 2011

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

- Alan

...