У них вообще нет ничего общего.
#define – это директива препроцессора, определяющая идентификатор и последовательность символов, которой будет замещаться данный идентификатор при его обнаружении в тексте программы.
const – ключевое слово, которое указывает на то, что объект или переменная не являются изменяемыми.
constexpr – спецификатор, с помощью которого можно создавать переменные, функции и объекты, которые будут рассчитаны на этапе компиляции.
C/C++
C++. Разница меджу #define и const ?
#define - имеет побочные эффекты
const - позволяет писать более надежный код, указывая компилятору на ограничения, которые он должен проверять.
const - позволяет писать более надежный код, указывая компилятору на ограничения, которые он должен проверять.
defne делает замену на этапе компиляции. const же сохраняет значения непосредственно в исполняемом модуле и хранит их в памяти, имея реальный адрес хранения, общий для всех подпрограмм и библиотек.
#define
распространяется на весь код целиком, даже на дополнительно включенные файлы, что может повлечь за собой ошибки. Это что-то типа глобальной переменной. Второе это неопределенный тип данных. Плюс в том что подстановка происходит на стадии компиляции.
const
это константная переменная и соответственно к ней применимы правила константной переменной. То есть область видимости и время жизни переменных. Плюс известен тип данных. Минус вместо подстановки значения, как в случае с #define, идет обращение к памяти, где лежит сама переменная. Лишнее обращение к памяти, хоть чуть чуть, но все же делает приложение медленней.
Есть еще constexpr
Она делает константные переменные, но, если такое возможно, подстановку делает на стадии компиляции, так же как #define. Плюсы применимы правила константной переменной и к этому же добавляется возможность подставлять напрямую значение, как в случае с #define.
распространяется на весь код целиком, даже на дополнительно включенные файлы, что может повлечь за собой ошибки. Это что-то типа глобальной переменной. Второе это неопределенный тип данных. Плюс в том что подстановка происходит на стадии компиляции.
const
это константная переменная и соответственно к ней применимы правила константной переменной. То есть область видимости и время жизни переменных. Плюс известен тип данных. Минус вместо подстановки значения, как в случае с #define, идет обращение к памяти, где лежит сама переменная. Лишнее обращение к памяти, хоть чуть чуть, но все же делает приложение медленней.
Есть еще constexpr
Она делает константные переменные, но, если такое возможно, подстановку делает на стадии компиляции, так же как #define. Плюсы применимы правила константной переменной и к этому же добавляется возможность подставлять напрямую значение, как в случае с #define.
define как правило используют в библиотеках (например WM_DESTROY это
#define WM_DESTROY 0x002, из winuser.h
).
const надо использовать в своём коде, в файле в котором ты будешь создавать условия с ним (например const HEIGHT=8, WIDTH=8, это допустим для шахмат карта)
#define WM_DESTROY 0x002, из winuser.h
).
const надо использовать в своём коде, в файле в котором ты будешь создавать условия с ним (например const HEIGHT=8, WIDTH=8, это допустим для шахмат карта)
#define это команда препроцессора выполняющий замену символических имен на их значения. Все операции препроцессоры выполняются до компиляции, когда запускаешь компиляцию, компилятор автоматически вызывает программу препроцессора и когда файл уже окончательно готов, компилятор начинает его переводить в объектный код. const это квалификатор указывающий компилятору что переменную нужно создать ток для чтения, при создании переменных const в памяти компьютера выделяется ячейка для неё, но она доступна ток для чтения, а вот для записи она недоступна, а при создании константов через define компилятор не резервирует память для них.
При передачи массива другой функции можно объявить параметр с квалификатором const который запретит все изменения в оригинальном массиве, и при передаче размера массива можно указать параметр с const так как размер массива никогда не меняется.
А define лучше всего использовать для магических чисел, к пример вместо того что бы писать число 3,14549 обозначающий число ПИ можно просто написать #define PI 3.14549.
Нужно запомнить что define не создает никакого объектного кода и не резервирует память для её хранения, а вот const резервирует память для хранения но ток для чтения. Помимо const есть другие квалификаторы как static auto register exretrn.
При передачи массива другой функции можно объявить параметр с квалификатором const который запретит все изменения в оригинальном массиве, и при передаче размера массива можно указать параметр с const так как размер массива никогда не меняется.
А define лучше всего использовать для магических чисел, к пример вместо того что бы писать число 3,14549 обозначающий число ПИ можно просто написать #define PI 3.14549.
Нужно запомнить что define не создает никакого объектного кода и не резервирует память для её хранения, а вот const резервирует память для хранения но ток для чтения. Помимо const есть другие квалификаторы как static auto register exretrn.
Николай Борисов
Препроцессор C/C++ уже давно встроен в компилятор. Но это не принципиально.
В современном C++ лучше не использовать #define для констант. Вместо этого есть специальное слово constexpr.
В современном C++ лучше не использовать #define для констант. Вместо этого есть специальное слово constexpr.
Похожие вопросы
- [c++] Почему при возврате строки по ссылке(const), она не выводится в консоль? Подробности внизу.
- В чем разница принимаемых аргументов C++?
- Значение типа const char* нельзя присвоить сущности типа char*
- Ошибка C2664: невозможно преобразовать аргумент 1 из "const char [6]" в "char *" в C ++
- В чем разница между C и C++?
- В чем разница между C++ xCode и C++ VisualStudio?
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование C++ ПРОШУ ПОМОЧЬ!
http://itnotesblog.ru/note.php?id=154