2013-10-27 1 views
4

В чем преимущества и недостатки использования #define над const (и наоборот)?
В C++ лучше использовать #define или const, чтобы избежать магических чисел?

Когда я читал о плохой практике программирования, а именно о магических числах, я чаще использовал #define. Некоторые вопросы возникли у меня в голове, например:

Плохо ли использовать #define много?
Требуется ли объем памяти?
Быстрее ли использовать const?

Я читал немного об этом, но я все еще не уверен, из того, что я понял:
#define определяет макрос (не уверен, что означает макрос), и он имеет дело с предварительной обработкой. Он заменяет все экземпляры определенного ключевого слова на что-то еще до того, как код обрабатывается. const, с другой стороны, является переменной, значение которой не может быть изменено в середине во время выполнения.

Единственная причина, по которой я могу думать об использовании const, - это то, что значение зависит от других переменных. Например:

#define PI 3.14159f 
#define RADIUS 3.0f 
#define AREAOFCIRCLE PI*RADIUS*RADIUS 

будет неэффективным, поскольку каждый экземпляр AREAOFCIRCLE будет заменен PI * RADIUS * RADIUS поэтому программа будет вычислять для него каждый раз, когда вы используете AREAOFCIRCLE. С другой стороны:

const float areaofcircle = PI*RADIUS*RADIUS; 

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

Итак, вернемся к исходному вопросу, как #define сравнить с const?

+0

Возможный дубликат: http://stackoverflow.com/questions/6274008/why-would-someone-use-define-to-define-constants?rq = 1 – lolando

+0

Я читал это, но меня не устраивает какой-либо из ответов – DarkPotatoKing

+0

Неправильно ли использовать '# define'? Старайтесь не использовать его вообще! –

ответ

7

Не беспокойтесь об эффективности в этом случае, поскольку все они будут вычисляться во время компиляции.

Вы должны прекратить использование макросов (по крайней мере, для определения констант), когда это возможно. Макросы - это дикие вещи против пространств имен и областей. С другой стороны, const объектов имеют тип, и это может уменьшить непреднамеренные ошибки.

Это всегда полезно прочитать часть Страуструп о советует: "So, what's wrong with using macros?"

+0

что «все они вычисляют во время компиляции». имею в виду? – DarkPotatoKing

+0

Не имеет значения, вы используете Macro или const, в обоих случаях результат 'PI * RADIUS * RADIUS' будет вычисляться во время компиляции, а окончательное значение будет заменено на назначение. – deepmax

+0

, так это значит #define AREAOFCIRCLE PI * RADIUS * RADIUS будет вычисляться программой только один раз, а не каждый раз, когда вы вызываете AREAOFCIRCLE? – DarkPotatoKing

3

«сопз» в C++ является бесценным. Consts применяет проверку типов в выражениях, а константы «#define» d просто расширяются.

Кроме того, поскольку константы печатаются, компилятор может мешать лучшей оптимизации, а с помощью определений он должен угадывать (1.0 - это float или double? Использование суффиксов как 1.0d или 1.0f может помочь, но я редко видел реальные числа написано так сознательно ...).

Так используйте consts для определения констант

const float PI = 3.14159f; 
const float RADIUS = 3.0f; 
const float AREAOFCIRCLE = PI*RADIUS*RADIUS; 

вы получите по крайней мере то же самое время компиляции оптимизаций + некоторые дополнительные проверки типа.

+2

'1.0' двойное. Нечего угадывать. – juanchopanza

-1

«const» более эффективен из-за того, что он занимает память один раз и будет упоминаться везде. Напротив, «#define» будет занимать пространство и операцию добавления в любом месте, где он будет использоваться.

+1

Не обязательно. – deepmax

+0

Почему #define занимают место? Я думал, что это только буквальная замена текста? – DarkPotatoKing

+0

, когда #define будет использоваться, это может привести к операции добавления зависит от компилятора –

Смежные вопросы