На данный вопрос уже ответили:
В чем в C++ разница между #define и const? То есть какой из вариантов предпочтительнее и в какой ситуации, есть ли вообще разница?
#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
Конечно, есть. Хотя бы в том, что const
дает возможность проверки типов. Компилятор знает, что такое const
, и разбирается, на своем ли он месте. О #define
знает только препроцессор.
Так что - всегда предпочтительнее const
.
#define
- это препроцессорная директива; препроцессор заменяет все эти макросы во время компиляции.
const
переменные - это фактические переменные языка.
Плюсы констант в проверке типов и т.п, как пример.
В целом, насколько я могу судить, в итоге получаем одно и то же. Разве что, у define'ов нету области видимости, а у констант есть.
Разница вот в чём:
definы компилятор просто подставляет во время компиляции, т.е. пишешь такой код:
#define NAME "Alex"
...
std::cout << NAME
И когда ты запускаешь компиляцию, компилятор сначала преобразует это в:
std::cout << "Alex"
И только потом компилирует.
А вот, когда ты используешь const, создаётся обычная переменная, только её нельзя изменять, т.е. если тв попробуешь её изменить, компилятор выдаст ошибку
Использовать #define только там, где нет возможности использовать const (constexpr в c++11). То есть, для определения констант #define уже достаточно давно использовать не рекомендуется.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Кусок кода для проверки интернет соединения:
Необходимо получить адрес начала PE-заголовка в памятиИспользую данный код:
Есть функция, которая при выводе текста на виджет Textedit (chat_edit), выравнивает его по левому краю через Qt::AlignLeftЯ хочу, чтоб, когда я получу текст,...