Это простой вопрос, но зачем кому-то использовать #define для определения констант?
Какая разница между
#define sum 1
и const int sum = 1;
Это простой вопрос, но зачем кому-то использовать #define для определения констант?
Какая разница между
#define sum 1
и const int sum = 1;
#define
имеет много разных приложений, но ваш вопрос, похоже, касается одного конкретного приложения: определение именованных констант.
В С++ редко существует причина использовать #define
для определения именованных констант.
#define
обычно широко используется в коде C, так как язык C существенно отличается от С++, когда дело доходит до определения констант. Короче говоря, объекты const int
не являются константами в C, а это значит, что в C основным способом определения истинной константы является использование #define
. (Кроме того, для констант int
можно использовать перечисления).
Никто не должен!
На самом деле, следует предпочесть const int sum = 1;
над #define sum 1
по ряду причин:
Механизм на основе видимости:
#define
не относятся к областям, поэтому нет возможности создать пространство имен с ограниченным классом. Хотя константные переменные могут быть ограничены в классах.
Избегайте странных магических чисел при ошибках компиляции:
Если вы используете #define
, то они заменяются предварительным процессором во время предварительной компиляции. Так что, если вы получаете сообщение об ошибке во время компиляции, это будет путать, потому что сообщение об ошибке не будет ссылаться на имя макроса, но значение, и оно будет появляются внезапное значение, и каждый мог бы потратить много времени на отслеживание этого кода.
Простота отладки:
Также по тем же причинам, указанным в # 2, в то время как отладка #define
не даст никакой помощи.
Таким образом, чтобы избежать вышеуказанных ситуаций, const
будет лучшим выбором.
В примере, который вы только что дали, я бы обычно использовал константу. За исключением, конечно, #define можно использовать для условной компиляции в другом месте:
#if SOME_DEFINE == 1
// Conditional code
#endif
Это то, что вы не можете сделать с константой. Если вам не нужно значение, доступное из препроцессора, я бы сказал, используйте const, если нет причин, почему это невозможно. Там некоторые вещи на этом в С++ FAQ lite, где они справедливо указывают на то, что только потому, что препроцессор "злой", это не значит вам это никогда не понадобится.
#define
необходимо сделать такие вещи, как включение охранников, потому что у С++ нет реальной системы импорта модулей.
#define
вызывает буквальную текстовую замену. Препроцессор понимает, как tokenize исходный код, но не имеет никакого представления о том, что на самом деле означает это. Когда вы пишете #define sum 1
, препроцессор просматривает ваш код и ищет каждый экземпляр токена sum
и заменяет его токеном 1
.
Это имеет ряд ограничений: #define sq(x) x * x
не будет работать правильно, если вы используете его как sq(3+3)
; и использование #define
для константы никак не относится к сфере видимости и не связывает какой-либо тип с константой. Тем не менее, #define
может использоваться (особенно в сочетании с некоторыми другими специальными элементами, такими как операторы препроцессора #
и ##
), чтобы сделать магию, которая в противном случае невозможна (за исключением того, что вручную выполняет то, что делает препроцессор).
Всегда пытайтесь использовать "const int", а не #define.
Используйте #define, только если ваш код препроцессора может быть прочитан другим инструментом, и ему проще идти с препроцессором, а не анализировать язык.
Также это единственный способ определить что-то, что будет проверено позже, # if/# else/# endif
Простыми словами
#define sum 1 is pre processed
Это означает, что sum
не существует после завершения этапа предварительной обработки.
const int sum = 1; is compiled/linked
Это означает, что sum
существует до тех пор, пока исполняемый файл не будет создан из вашей программы.
const int
- это просто int, который не может измениться. #define
- это директива для препроцессора C, которая намного больше, чем просто для определения констант.
Подробнее см. здесь http://en.wikipedia.org/wiki/C_preprocessor
Во-первых, это директива препроцессора, прежде чем компилятор компилирует ваш код, он перейдет и заменит сумму на 1. Вторая объявляет переменную в памяти для хранения этого количества. Я уверен, что можно утверждать, что лучше, но "const int", вероятно, более распространен в С++ (когда дело доходит до числовых констант).
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html