【问题标题】:Question regarding the syntax of someting related to macro in C++关于 C++ 中与宏相关的某些语法的问题
【发布时间】:2020-04-18 21:32:50
【问题描述】:
#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;

}

这是来自hackerrank question 的示例问题,因此其中会有一些错误。我想知道这部分是什么

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

是什么意思?它看起来不像宏,因为它不是以#define 开头的。论坛也没有对这部分有很好的解释,只是它与定义为#define minimum(mn, b) mn = min(b)#define maximum(mx, c) mx = max(c)的宏有关。 ' 我想知道它叫什么,以及一些关于阅读它的好资源的建议。

标题写得不好,因为我不知道该将代码中可疑的部分称为什么。

【问题讨论】:

  • 我不相信#define FUNCTION(a,b) # 是有效的语法。 # 运算符应位于标记之前。
  • 您应该“将代码中可疑的部分称为”任何有自尊的 C++ 开发人员都不应该编写的东西。像“hackerrank”这样的网站,以及类似的网站,并没有教你写得很好的 C++,也没有提供有用的知识。它们是对网络空间的浪费。
  • @IgorTandetnik 您可以在我提供的链接中查看问题。
  • 链接中的问题似乎根本不包含FUNCTION,无论是任何形状或形式。至少不是该页面对未登录用户的显示方式,而且我不会在该站点创建帐户。
  • 它甚至没有编译(如预期的那样):main.cpp:6:21: error: '#' is not followed by a macro parameter

标签: c++ c++11 macros


【解决方案1】:

让我们把这个答案分成几部分:


首先,您在此处显示的内容不是有效代码。 #define FUNCTION(a, b) # 不能在 GCC 上编译,它正确地说:

error: '#' is not followed by a macro parameter

# 应该像您的 toStr 示例中所示那样工作,其中#a 导致它发出一个 string,其中 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)


第四,对于这个hackerrank 问题,大多数 解决方案似乎将FUNCTION 变成了无操作,而是将minimummaximum 创建为宏。

但是,我觉得FUNCTION 背后的意图是别的东西,更聪明一点。您可以将其定义为创建以第一个参数命名的函数(因此得名)的宏,它根据用作比较运算符的第二个参数比较最小值/最大值:

#define FUNCTION(_FN_NAME_, _COMPARISON_OP_) \
  void _FN_NAME_(int& limit, int newValue) { \
    if (newValue _COMPARISON_OP_ limit) { \
      limit = newValue; \
    } \
  }

这样,FUNCTION(minimum, &lt;)FUNCTION(maximum, &gt;) 将扩展为:

void minimum(int& limit, int newValue) {
  if (newValue < limit) {
    limit = newValue;
  }
}

void maximum(int& limit, int newValue) {
  if (newValue > limit) {
    limit = newValue;
  }
}

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 2015-08-13
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多