Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Различие define и const

В чем различие между этими определениями переменной:
#define N 100
и
const int n = 100;
Что из этих двух является более предпочтительным и в чем достоинства каждого?


Ответ

Это очень дискуссионный вопрос у всех. Но в целом, в с++ лучше использовать const везде, где это возможно.
Плюсы:
на них действуют области видимости. компилятор относится к ним как к обычными переменным, доступным только на чтение. у них есть тип.
У define это все - недостатки. Они действуют от места определения и до ... конца. Хотя, где этот конец будет - ещё нужно хорошо подумать. Они могут переопределять друг дружку и иногда искать, где именно было в очередной раз переопределено - ещё то удовольствие. Компилятор часто выдает очень "загадочные ошибки". Классический пример с макросом min/max. Файл windows.h определяет их. И может быть очень весело. Детали - NOMINMAX
Ещё у define есть большой недостаток - это то, что некоторые думают, что там есть скобки. А их нет.
#define add(a,b) a+b
if (add(x,y) * add(x,y)) {}
кажется, что будет посчитано (x+y) в квадрате. А на самом деле - .... на самом деле x+y + x*y.
Но мы немного отвлеклись. Такого сделать обычным const уже нельзя. Но легко сделать inline функциями. И их результат будет предсказуемый.
Поэтому:
eсли нужно просто определить константу - используйте const (даже само слово намекает). eсли нужно определить макрос - используйте функции (если хочется интересней - используйте inline, но компиляторы сейчас достаточно умные). если нужно усложнить код и добавить синтаскического сахара - тогда самое время использовать define.
UPD
А ещё хорошо найти книгу Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ - Скотт Майерс и почитать второй совет (в любом случае - там всю книгу можно читать и читать).

Комментариев нет:

Отправить комментарий