Разница между define и const [дубликат]

270
13 ноября 2017, 21:28

На данный вопрос уже ответили:

  • Различие define и const 2 ответа

В чем в C++ разница между #define и const? То есть какой из вариантов предпочтительнее и в какой ситуации, есть ли вообще разница?

Answer 1

#define - это макрос препроцессора, он просто выполняет замену строки текста на своё содержимой. До c++11 его имело смысл использовать для глобальных численных констант.

const - это квалификатор типа, говорящий, что переменная не должна меняться после инициализации. Но эта инициализация где-то должна произойти, и от константности можно вручную избавиться при помощи const_cast.

В c++11 был добавлен квалификатор constexpr, который указывает на то, что переменная может как-то изменяться только во время компиляции, но не во время выполнения. Детали зависят от версии стандарта. Теперь можно без проблем объявлять статические константы, в том числе сложных типов. Например:

namespace constants{
  static constexpr double g = 9.8;
  struct minus_fn_impl{
    template<class T> 
    T operator () (const T& lha, const T& rha){
       return lha - rha;
    }
  };
  static constexpr minus_fn_impl minus_fn;
}
...
double v = 5.3;
double r = constants::minus_fn(v, constants::g); // не нужно инициализировать функциональный объект, как в случае std::minus
Answer 2

Конечно, есть. Хотя бы в том, что const дает возможность проверки типов. Компилятор знает, что такое const, и разбирается, на своем ли он месте. О #define знает только препроцессор.

Так что - всегда предпочтительнее const.

Answer 3

#define - это препроцессорная директива; препроцессор заменяет все эти макросы во время компиляции.

const переменные - это фактические переменные языка. Плюсы констант в проверке типов и т.п, как пример.

В целом, насколько я могу судить, в итоге получаем одно и то же. Разве что, у define'ов нету области видимости, а у констант есть.

Answer 4

Разница вот в чём: definы компилятор просто подставляет во время компиляции, т.е. пишешь такой код: #define NAME "Alex" ... std::cout << NAME И когда ты запускаешь компиляцию, компилятор сначала преобразует это в: std::cout << "Alex" И только потом компилирует. А вот, когда ты используешь const, создаётся обычная переменная, только её нельзя изменять, т.е. если тв попробуешь её изменить, компилятор выдаст ошибку

Answer 5

Использовать #define только там, где нет возможности использовать const (constexpr в c++11). То есть, для определения констант #define уже достаточно давно использовать не рекомендуется.

READ ALSO
Как преобразовать аргумент из std::string в LPCWSTR

Как преобразовать аргумент из std::string в LPCWSTR

Кусок кода для проверки интернет соединения:

804
Что возвращает GetModuleHandle(NULL)

Что возвращает GetModuleHandle(NULL)

Необходимо получить адрес начала PE-заголовка в памятиИспользую данный код:

264
Qt Widgets. Форматирование текста.

Qt Widgets. Форматирование текста.

Есть функция, которая при выводе текста на виджет Textedit (chat_edit), выравнивает его по левому краю через Qt::AlignLeftЯ хочу, чтоб, когда я получу текст,...

281
Палиндром - ошибка

Палиндром - ошибка

Программа должна проверять строку на палиндромНе понимаю , в чем ошибка

232