Подтвердить что ты не робот

В чем разница между #define и const?

Возможные дубликаты:
Почему кто-то использует #define для определения констант?
разница между макросом и константой в С++
С++ - enum vs. const vs. #define

В чем разница между использованием #define и const для создания константы? Имеет ли преимущество в производительности преимущество над другим? Естественно, я предпочитаю использовать const, но я буду рассматривать #define, если у него есть подходящие преимущества.

4b9b3361

Ответ 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.   Используйте постоянную там, где это возможно, что я думаю.