Давайте разберем этот ответ на части:
Во-первых, то, что вы показываете здесь, не является допустимым кодом. #define FUNCTION(a, b) #
не компилируется на G CC, он правильно говорит:
error: '#' is not followed by a macro parameter
#
должен работать так, как показано в вашем примере toStr
, где #a
заставляет его излучать строка со значением a
в качестве содержимого.
Во-вторых, я предполагаю , что плакат этого "решения" хотел FUNCTION
просто ничего не делайте.
Кажется, что некоторые компиляторы так и поступают с #
, но это не правильно. Было бы полезно написать #define FUNCTION(a, b)
без чего-либо впоследствии (или #define FUNCTION(a, b) //
, как я видел в некоторых других решениях для этого вопроса).
Итак, ответ на вопрос «что делает эта часть» буквально «ничто». (по крайней мере, так было задумано) это, на самом деле, он не вычисляет ни минимум, ни максимум, потому что min
не получает предыдущий минимум в качестве аргумента (то же самое для max
)! Я ожидал бы это ...
#define minimum(mn, b) mn = min(mn, b)
#define maximum(mx, c) mx = max(mx, c)
... вместо текущих min(b)
и max(c)
там.
Далее, кажется, что большинство решений по этому хакерранковскому вопросу превращают FUNCTION
в бездействие и вместо этого создают minimum
и maximum
в качестве макросов.
Но я чувствую, что намерение, стоящее за FUNCTION
, было чем-то еще что-то более умное. Вы можете определить его как макрос, который создает функции (отсюда и имя), названные в честь первого аргумента, которые сравнивают минимум / максимум на основе второго аргумента, используемого в качестве оператора сравнения:
#define FUNCTION(_FN_NAME_, _COMPARISON_OP_) \
void _FN_NAME_(int& limit, int newValue) { \
if (newValue _COMPARISON_OP_ limit) { \
limit = newValue; \
} \
}
Таким образом, FUNCTION(minimum, <)
и FUNCTION(maximum, >)
расширились бы до:
void minimum(int& limit, int newValue) {
if (newValue < limit) {
limit = newValue;
}
}
void maximum(int& limit, int newValue) {
if (newValue > limit) {
limit = newValue;
}
}