В чем разница между #define и const?
Возможные дубликаты:
Почему кто-то использует #define для определения констант?
разница между макросом и константой в С++
С++ - enum vs. const vs. #define
В чем разница между использованием #define
и const
для создания константы? Имеет ли преимущество в производительности преимущество над другим? Естественно, я предпочитаю использовать const
, но я буду рассматривать #define
, если у него есть подходящие преимущества.
Ответы
Ответ 1
Директива #define
- это директива препроцессора; препроцессор заменяет эти макросы своим телом, прежде чем компилятор даже увидит его. Подумайте об этом как о автоматическом поиске и замене исходного кода.
Объявление константной переменной объявляет фактическую переменную на языке, которую вы можете использовать... ну, как реальная переменная: возьмите свой адрес, передайте его, используйте его, конвертируйте и т.д.
О, производительность. Возможно, вы думаете, что избежать объявления переменной экономит время и пространство, но с любыми разумными уровнями оптимизации компилятора не будет никакой разницы, поскольку постоянные значения уже заменены и складываются во время компиляции. Но вы получаете огромное преимущество в проверке типов и превращении своего кода в отладчик, поэтому нет причин не использовать константные переменные.
Ответ 2
#define
создает объект для подстановки макропроцессором, который сильно отличается от константы, потому что в зависимости от того, что вы определяете, он будет или не будет рассматриваться как константа. Содержимое #define может быть сколь угодно сложным, классический пример выглядит следующим образом:
#define SQR(x) (x)*(x)
Затем позже, если используется:
SQR(2+3*4)
Это будет превращено в:
(2+3*4)*(2+3*4)
Ответ 3
Разница в том, что #define обрабатывается препроцессором, делая то, что составляет простое замену текста. Значения Const, определенные таким образом, не видны для реального компилятора, тогда как переменная, определенная с помощью модификатора const, представляет собой фактически типизированную "переменную" (ну не совсем такую переменную). Недостатком #define является то, что заменяет каждое возникновение имени, в то время как константные переменные получают нормальный поиск, поэтому у вас меньше риск конфликтов имен и он не набирается.
Преимущество #define в том, что она гарантирует константность и, следовательно, не будет ни одной переменной подложки. Константные переменные могут быть или не быть заменены в коде, поэтому #define может быть быстрее в некоторых ситуациях. Однако хороший компилятор в любом случае должен встраивать эти константы, и вряд ли это может сыграть большую роль в большинстве ситуаций, поэтому я буду продолжать использовать const, если у вас нет части кода, где вы видели, что компилятор не ввел переменную, и это очень, очень критичный по производительности код.
Ответ 4
#define
является текстовой заменой, поэтому она так же быстро, как может быть. Плюс это гарантирует стабильность. Недостатком является то, что он не безопасен по типу.
С другой стороны, переменные const
могут быть заменены или не могут быть заменены inline в коде. Вы можете отбросить константу, заставляя ее быть в памяти (хотя она, вероятно, всегда находится в памяти только для чтения, но в любом случае есть головные боли). Он гарантированно безопасен по типу, но поскольку он несет в себе свой собственный тип.
Я лично рекомендовал const
, чтобы ваше намерение было понятным.
Ответ 5
#define A B
указывает препроцессору (часть компилятора) на подструктуру B
везде, где он видит A
в коде, и делает это перед компиляцией кода. Вы могли (хотя это ужасная идея) сделать что-то вроде #define FALSE TRUE
.
Константная переменная означает, что после установки переменной она не может быть изменена, однако она ничего не делает с препроцессором и подчиняется нормальным правилам переменных.
Ответ 6
DEFINE - это команда препроцессора, например #define x 5. Компилятор принимает это значение, а вставка - это когда вы вызываете x в программе и генерируете файл объекта. Определите константы, которые не создают запись символа в таблице символов. Если вы хотите отладить программу, вы не найдете x. Используйте постоянную там, где это возможно, что я думаю.