При использовании констант два ответа выше правильны, однако #define
не ограничивается только этим использованием. Другим примером использования #define
являются макросы.
Макросы
Макросы препроцессора-используются фрагменты кода, и они работают точно так же, как и другие #define
заявлений в этой связи. Препроцессор буквально заменит появление вашего определенного символа кодом макроса. Пример:
#define HELLO_MAC do{ std::cout << "Hello World" << std::endl; }while(false)
int main(int argc, char** argv)
{
HELLO_MAC;
}
Это будет буквально поменять на HELLO_MAC
символ с кодом, я объявил. Если бы он был постоянным, он бы сделал то же самое. Итак, вы можете думать о #define
s для констант как особый вид макроса.
С помощью макросов вы также можете передавать параметры, и это особенно полезно для обеспечения соблюдения правил ведения журнала/исключений по коду. Например
#define THROW_EXCEPT(ex_type, ex_msg)/
do{ throw ex_type(buildExString((ex_msg), __LINE__, __FILE__)); }while(false)
...
// somewhere else
THROW_EXCEPT(std::runtime_error, "Unsupported operation in current state");
Этот код позволяет мне гарантировать, что все журналы с линией файла, который выбросил исключение.
Шаблоны часто являются лучшим выбором вместо макросов, но я не могу использовать функции шаблона для этого примера, потому что мне нужно использовать функции __LINE__
и __FILE__
от места броска, а не от расположения функции шаблона.
Где вы не должны использовать макросы? В любом месте вы можете использовать что-то еще. Макросы, как и любые #define
, предварительно обрабатываются, поэтому компилятор их вообще не видит. Это означает, что для HELLO_MAC
или THROW_EXCEPT
символов не существует, и поэтому их нельзя увидеть в отладчике. Они также могут сбивать с толку, если вы получаете ошибки компиляции, особенно если они являются длинными макросами.
Пройдите эту тему. Лучший ответ оттуда - '# define's' не относятся к сфере видимости - http://stackoverflow.com/questions/1944041/advantage-and-disadvantages-of-defines-vs-constants –