Почему существуют определенные и объявленные константы в CPP? - PullRequest
2 голосов
/ 21 апреля 2010

Почему существует два способа "объявить" константы в CPP?
Что лучше, или я должен написать, какой из них я должен использовать, когда?

#define MYCON 100
const int MYCON=100

Ответы [ 3 ]

8 голосов
/ 21 апреля 2010

Краткое правило: Для условной компиляции (например, разные фрагменты кода для DEBUG и RELEASE) используйте #define. Для всех остальных случаев используйте const конструкция.

1 голос
/ 21 апреля 2010

Использование #define создает символ препроцессора: он вообще не существует после предварительной обработки и эквивалентен вводу "100" в файл.

Особенности символов препроцессора:

  • Вы можете использовать их в директиве препроцессора, например #ifdef
  • имеет лексическую сферу
  • Вы можете не взять их адрес (и, следовательно, не можете использовать их в качестве аргументов, когда ожидается type*)

Использование const type объявляет переменную c ++.

  • Вы можете не использовать эту вещь в директивах препроцессора
  • Это следует обычным правилам области видимости c ++
  • Вы можете взять его адрес

Считается, что лучше использовать const для констант "в программе" и #define только для условной компиляции (которая представляет собой изменение с (очень!) Старых дней, когда вы не всегда могли полагаться на компилятор c для обрабатывать const разумно и использовать #define было предпочтительным). Если ничего другого, это дает вам лучший контроль над областью символа.

0 голосов
/ 21 апреля 2010

В исходной версии C, #define был единственным доступным методом объявления постоянного значения.Это было сделано во время компиляции, а не во время выполнения: компилятор жестко закодировал значение для каждой инструкции.const является функцией C ++ (позже добавленной в C ограниченным образом), а в C ++ рекомендуется использовать const, а не #define.const переменные фактически существуют в памяти и могут быть инициализированы при создании во время выполнения.

#define, однако, все еще часто используется в C ++, главным образом для связи с компилятором.Некоторые примеры:

Оболочки заголовка класса для предотвращения нескольких объявлений классов:

#ifdef VAL_H
#define VAL_H

// Define class header

#endif // VAL_H

Условная компиляция:

// Comment this line to disable debug output
#define DEBUG

// Some code
#ifdef DEBUG
// Only gets compiled if DEBUG is defined.
cerr << "Debug output here" << endl;
#endif
...