Вопрос относительно синтаксиса Someting, связанного с макросом в C ++ - PullRequest
0 голосов
/ 19 апреля 2020
#define minimum(mn, b) mn = min(b) 
#define maximum(mx, c) mx = max(c)
#define INF 10000000
#define toStr(a) #a
#define io(v) v.push_back()
#define FUNCTION(a,b) #

#include <iostream>
#include <vector>
using namespace std;

#if !defined toStr || !defined io || !defined FUNCTION || !defined INF
#error Missing preprocessor definitions
#endif 

FUNCTION(minimum, <)
FUNCTION(maximum, >)

int main(){
    int n; cin >> n;
    vector<int> v(n);
    foreach(v, i) {
        io(v)[i];
    }
    int mn = INF;
    int mx = -INF;
    foreach(v, i) {
        minimum(mn, v[i]);
        maximum(mx, v[i]);
    }
    int ans = mx - mn;
    cout << toStr(Result =) <<' '<< ans;
    return 0;

}

Это пример вопроса из хакерранкского вопроса n, поэтому в нем могут быть ошибки. Я хочу знать, что означает часть

FUNCTION(minimum, <)
FUNCTION(maximum, >)

? Он не похож на макрос, так как не начинается с #define. На дискуссионных форумах тоже не было хорошего объяснения этой части, просто она относится к макросу, определенному как #define minimum(mn, b) mn = min(b) и #define maximum(mx, c) mx = max(c). «Я хочу знать, как это называется, и дать несколько советов о хорошем ресурсе, чтобы прочитать об этом.

Название написано плохо, так как я понятия не имею, на что ссылаться на эту сомнительную часть кода.

1 Ответ

1 голос
/ 19 апреля 2020

Давайте разберем этот ответ на части:


Во-первых, то, что вы показываете здесь, не является допустимым кодом. #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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...