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

Почему кто-то использует #define для определения констант?

Это простой вопрос, но зачем кому-то использовать #define для определения констант?

Какая разница между

#define sum 1 и const int sum = 1;

4b9b3361

Ответ 1

#define имеет много разных приложений, но ваш вопрос, похоже, касается одного конкретного приложения: определение именованных констант.

В С++ редко существует причина использовать #define для определения именованных констант.

#define обычно широко используется в коде C, так как язык C существенно отличается от С++, когда дело доходит до определения констант. Короче говоря, объекты const int не являются константами в C, а это значит, что в C основным способом определения истинной константы является использование #define. (Кроме того, для констант int можно использовать перечисления).

Ответ 2

Никто не должен! На самом деле, следует предпочесть const int sum = 1; над #define sum 1 по ряду причин:

Механизм на основе видимости:

#define не относятся к областям, поэтому нет возможности создать пространство имен с ограниченным классом. Хотя константные переменные могут быть ограничены в классах.


Избегайте странных магических чисел при ошибках компиляции:

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


Простота отладки:

Также по тем же причинам, указанным в # 2, в то время как отладка #define не даст никакой помощи.


Таким образом, чтобы избежать вышеуказанных ситуаций, const будет лучшим выбором.

Ответ 3

В примере, который вы только что дали, я бы обычно использовал константу. За исключением, конечно, #define можно использовать для условной компиляции в другом месте:

#if SOME_DEFINE == 1
    // Conditional code
#endif

Это то, что вы не можете сделать с константой. Если вам не нужно значение, доступное из препроцессора, я бы сказал, используйте const, если нет причин, почему это невозможно. Там некоторые вещи на этом в С++ FAQ lite, где они справедливо указывают на то, что только потому, что препроцессор "злой", это не значит вам это никогда не понадобится.

Ответ 4

#define необходимо сделать такие вещи, как включение охранников, потому что у С++ нет реальной системы импорта модулей.

#define вызывает буквальную текстовую замену. Препроцессор понимает, как tokenize исходный код, но не имеет никакого представления о том, что на самом деле означает это. Когда вы пишете #define sum 1, препроцессор просматривает ваш код и ищет каждый экземпляр токена sum и заменяет его токеном 1.

Это имеет ряд ограничений: #define sq(x) x * x не будет работать правильно, если вы используете его как sq(3+3); и использование #define для константы никак не относится к сфере видимости и не связывает какой-либо тип с константой. Тем не менее, #define может использоваться (особенно в сочетании с некоторыми другими специальными элементами, такими как операторы препроцессора # и ##), чтобы сделать магию, которая в противном случае невозможна (за исключением того, что вручную выполняет то, что делает препроцессор).

Ответ 5

Всегда пытайтесь использовать "const int", а не #define.

Используйте #define, только если ваш код препроцессора может быть прочитан другим инструментом, и ему проще идти с препроцессором, а не анализировать язык.

Также это единственный способ определить что-то, что будет проверено позже, # if/# else/# endif

Ответ 6

Простыми словами

#define sum 1  is pre processed

Это означает, что sum не существует после завершения этапа предварительной обработки.

const int sum = 1; is compiled/linked

Это означает, что sum существует до тех пор, пока исполняемый файл не будет создан из вашей программы.

Ответ 7

const int - это просто int, который не может измениться. #define - это директива для препроцессора C, которая намного больше, чем просто для определения констант.

Подробнее см. здесь http://en.wikipedia.org/wiki/C_preprocessor

Ответ 8

Во-первых, это директива препроцессора, прежде чем компилятор компилирует ваш код, он перейдет и заменит сумму на 1. Вторая объявляет переменную в памяти для хранения этого количества. Я уверен, что можно утверждать, что лучше, но "const int", вероятно, более распространен в С++ (когда дело доходит до числовых констант).

http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html