C/C++

C++. Разница меджу #define и const ?

У них вообще нет ничего общего.

#define – это директива препроцессора, определяющая идентификатор и последовательность символов, которой будет за­мещаться данный идентификатор при его обнаружении в тексте программы.

const – ключевое слово, которое указывает на то, что объект или переменная не являются изменяемыми.

constexpr – спецификатор, с помощью которого можно создавать переменные, функции и объекты, которые будут рассчитаны на этапе компиляции.
Николай Герберт
Николай Герберт
72 852
Лучший ответ
#define - имеет побочные эффекты

const - позволяет писать более надежный код, указывая компилятору на ограничения, которые он должен проверять.
Алексей Патраков этот вопрос хорошо разъяснен здесь
http://itnotesblog.ru/note.php?id=154
Николай Борисов В программировании есть термин "побочный эффект", у него другое значение.
defne делает замену на этапе компиляции. const же сохраняет значения непосредственно в исполняемом модуле и хранит их в памяти, имея реальный адрес хранения, общий для всех подпрограмм и библиотек.
Коля Лысенков
Коля Лысенков
55 231
#define
распространяется на весь код целиком, даже на дополнительно включенные файлы, что может повлечь за собой ошибки. Это что-то типа глобальной переменной. Второе это неопределенный тип данных. Плюс в том что подстановка происходит на стадии компиляции.
const
это константная переменная и соответственно к ней применимы правила константной переменной. То есть область видимости и время жизни переменных. Плюс известен тип данных. Минус вместо подстановки значения, как в случае с #define, идет обращение к памяти, где лежит сама переменная. Лишнее обращение к памяти, хоть чуть чуть, но все же делает приложение медленней.
Есть еще constexpr
Она делает константные переменные, но, если такое возможно, подстановку делает на стадии компиляции, так же как #define. Плюсы применимы правила константной переменной и к этому же добавляется возможность подставлять напрямую значение, как в случае с #define.
Vlaik
Vlaik
15 408
define как правило используют в библиотеках (например WM_DESTROY это
#define WM_DESTROY 0x002, из winuser.h
).
const надо использовать в своём коде, в файле в котором ты будешь создавать условия с ним (например const HEIGHT=8, WIDTH=8, это допустим для шахмат карта)
Mehmet Karakus
Mehmet Karakus
7 902
#define это команда препроцессора выполняющий замену символических имен на их значения. Все операции препроцессоры выполняются до компиляции, когда запускаешь компиляцию, компилятор автоматически вызывает программу препроцессора и когда файл уже окончательно готов, компилятор начинает его переводить в объектный код. const это квалификатор указывающий компилятору что переменную нужно создать ток для чтения, при создании переменных const в памяти компьютера выделяется ячейка для неё, но она доступна ток для чтения, а вот для записи она недоступна, а при создании константов через define компилятор не резервирует память для них.

При передачи массива другой функции можно объявить параметр с квалификатором const который запретит все изменения в оригинальном массиве, и при передаче размера массива можно указать параметр с const так как размер массива никогда не меняется.

А define лучше всего использовать для магических чисел, к пример вместо того что бы писать число 3,14549 обозначающий число ПИ можно просто написать #define PI 3.14549.

Нужно запомнить что define не создает никакого объектного кода и не резервирует память для её хранения, а вот const резервирует память для хранения но ток для чтения. Помимо const есть другие квалификаторы как static auto register exretrn.
Николай Борисов Препроцессор C/C++ уже давно встроен в компилятор. Но это не принципиально.
В современном C++ лучше не использовать #define для констант. Вместо этого есть специальное слово constexpr.