При использовании констант два приведенных выше ответа верны, однако #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
, и поэтому они не могут быть видны в отладчике. Они также могут сбивать с толку, если вы получаете ошибки компиляции, особенно если это длинные макросы.
person
Dennis
schedule
05.03.2013
#define's
не соблюдайте область действия - stackoverflow.com/questions/1944041/ - person Mudassir Hasan   schedule 05.03.2013