Expressions and statements
ES.31
Не используйте макросы для констант и «функций»
Причина
Макросы являются основным источником ошибок. Макросы не подчиняются обычным правилам области видимости и типов. Макросы не подчиняются обычным правилам передачи аргументов. Макросы гарантируют, что человек-читатель видит нечто иное, чем компилятор. Макросы усложняют создание инструментов.
Пример (плохой)
#define PI 3.14
#define SQUARE(a, b) (a * b)
Даже если бы мы не оставили известную ошибку в SQUARE, существуют значительно более корректные альтернативы; например:
constexpr double pi = 3.14;
template<typename T> T square(T a, T b) { return a * b; }
Контроль
Кричите, когда видите макрос, который используется не только для управления исходным кодом (например, #ifdef)