Зачем кому-то использовать #define для определения констант? - PullRequest
48 голосов
/ 08 июня 2011

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

В чем разница между

#define sum 1 и const int sum = 1;

Ответы [ 9 ]

39 голосов
/ 08 июня 2011

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

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

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

37 голосов
/ 08 июня 2011

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

Механизм на основе области действия:

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


Как избежать странных магических чисел во время ошибок компиляции:

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


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

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


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

8 голосов
/ 08 июня 2011

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

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

Это то, что вы не можете сделать с const. Если вам не нужно, чтобы значение было доступно из препроцессора, я бы сказал, используйте const, если нет какой-либо причины, почему это невозможно. Об этом есть кое-что в C ++ FAQ Lite , где они справедливо отмечают, что если препроцессор «злой», это не значит, что он вам никогда не понадобится.

3 голосов
/ 08 июня 2011

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

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

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

2 голосов
/ 08 июня 2011

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

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

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

1 голос
/ 24 июня 2018

С Введение в программирование на C ++ , написанное Даниэлем Лянгом, гласило:

Когда вы определяете константу с помощью директивы #define, константа не сохраняется вПамять. Константа будет заменена значением компилятором.Когда вы объявляете константу с помощью ключевого слова const, константа сохраняется в памяти точно так же, как и переменная.

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

0 голосов
/ 08 июня 2011

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

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

0 голосов
/ 08 июня 2011

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

#define sum 1  /*is pre processed*/

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

const int sum = 1; /*is compiled/linked*/

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

0 голосов
/ 08 июня 2011

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

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

...