#define
сам по себе неплох, но у него есть некоторые плохие свойства. Я перечислю несколько вещей, которые мне известны:
«Функции» не работают должным образом.
Разумным кажется следующий код:
#define getmax(a,b) (a > b ? a : b)
... но что будет, если я назову это так ?:
int a = 5;
int b = 2;
int c = getmax(++a,b); // c equals 7.
Нет, это не опечатка. c
будет равно 7. Если не верите, попробуйте. Одного этого должно быть достаточно, чтобы вас напугать.
Препроцессор по своей природе глобален
Каждый раз, когда вы используете #define
для определения функции (например, stop()
), он действует во ВСЕХ включенных файлах после обнаружения.
Это означает, что вы действительно можете изменять библиотеки, которые вы не писали. Пока они используют функцию stop()
в файле заголовка, вы можете изменить поведение кода, который вы не писали и не изменяли.
Отладка сложнее.
Препроцессор выполняет символическую замену до того, как код дойдет до компилятора. Таким образом, если у вас есть следующий код:
#define NUM_CUSTOMERS 10
#define PRICE_PER_CUSTOMER 1.10
...
double something = NUM_CUSTOMERS * PRICE_PER_CUSTOMER;
если в этой строке есть ошибка, то вы НЕ увидите удобные имена переменных в сообщении об ошибке, а увидите что-то вроде этого:
double something = 10 * 1.10;
Так что поиск чего-либо в коде становится сложнее. В этом примере это не кажется таким уж плохим, но если вы действительно приобретете привычку делать это, то можете столкнуться с настоящими головными болями.
person
riwalk
schedule
26.09.2011
stop
и попробуйте вызвать его. - person Brendan Long   schedule 27.09.2011