Прочитав еще один вопрос об использовании макросов, я задавался вопросом: что являются они хороши для?Что такое макросы препроцессора?
Одна вещь, которую я не вижу заменить на любой другой язык конструкции очень скоро в убывающей число родственных слов вам необходимо ввести следующее:
void log_type(const bool value) { std::cout << "bool: " << value; }
void log_type(const int value) { std::cout << "int: " << value; }
...
void log_type(const char value) { std::cout << "char: " << value; }
void log_type(const double value) { std::cout << "int: " << value; }
void log_type(const float value) { std::cout << "float: " << value; }
в отличие от
#define LOGFN(T) void log_type(const T value) { std::cout << #T ## ": " << value; }
LOGFN(int)
LOGFN(bool)
...
LOGFN(char)
LOGFN(double)
LOGFN(float)
Любые другие «незаменимые»?
EDIT: пытается обобщить причины, по которым встречаются ответы; так как это меня заинтересовало. В основном потому, что у меня такое чувство, что большинство из них связано с тем, что мы все еще программируем в сырых текстовых файлах, но в то же время плохо поддерживающих средах.
- гибкость кода в компилируется (например, проблемы
#ifdef DEBUG
платформы) (SadSido, Catalin, Гоз) - целей отладки (например,
__LINE__, __TIME__
); Я также поставил «подтягивание» по этой причине (SadSido, Jla3ep, Jason S) - заменить, например. РНР
require
противinclude
функции (#pragma once
) (SadSido, Каталин) повышение - читаемости путем замены сложного кода (например,
MESSAGEMAP
,BOOST_FOREACH
) (SadSido, fnieto) - DRY принципа (Jason S)
- сменных фильтрующей рядных (Маттиас Вандел, Роберт С.Barnes)
- stringifying (Jason S)
Первый вариант выглядит более понятным для меня. –
Это точно. Это означает, что это плохой пример. Я постараюсь придумать лучшее. – xtofl
Это не должно быть макросом, это должно быть просто функцией шаблона, например 'template void log_type (const T value) {...}'. Таким образом, использование макросов уже давно заменено другой языковой конструкцией. –
sth