【问题标题】:Is it possible to swap the occurences of two variables using macros in C++?是否可以使用 C++ 中的宏交换两个变量的出现?
【发布时间】:2019-08-30 22:14:44
【问题描述】:

我正在处理一个竞赛问题,我必须按以下方式初始化一个向量:

vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j}, 
                             {j,i}, {j,-i}, {-j,i}, {-j,-i}});

虽然我知道这不是最好的方法,并且我知道有许多不同的方法可以轻松完成此操作,但我想知道 C++ 宏是否有一种方法可以让我简单地复制粘贴前四个元素上述向量的实现相同的方式如下:

vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
#define i j 
#define j i
                             {i,j}, {i,-j}, {-i,j}, {-i,-j}
#undef i
#undef j
                             });

由于变量的循环引用,上面的代码显然不起作用。

附注: 尽管 Matteo Italia 的回答在上述情况下是绝对正确的,但我更想知道在 C++ 中是否可以使用宏交换变量的出现,以及如何,如果可能的话?

【问题讨论】:

标签: c++ macros


【解决方案1】:

如果你真的认为这是一种节省,你可以使用一个函数风格的宏并调用它两次,交换它的参数。

#define SIGN_COMB(a, b) {(a), (b)}, {(a), -(b)}, {-(a), (b)}, {-(a), -(b)}
vector<pair<int,int>> moves({SIGN_COMB(i, j), SIGN_COMB(j, i)})

像往常一样,宏扩展中的括号是为了避免在表达式作为参数传递时出现意外(如果传入例如x+y,则否定项将是-x+y,而不是-(x+y))。

【讨论】:

    【解决方案2】:

    宏是邪恶的,在这种情况下不是一个好主意。但是,由于这似乎是已知的,并且问题更多的是学术性质:考虑“定义”而不是“交换”。您既不能使用“i”也不能使用“j”作为宏的名称,因为您希望两者都出现在已处理的代码中。所以为你的宏引入两个新的标识符。更新前四个元素以使用新标识符后,您可以按要求复制和粘贴它们。

    vector<pair<int,int>> moves({
    #define a i
    #define b j
                                 {a,b}, {a,-b}, {-a,b}, {-a,-b},
    #undef a
    #undef b
    #define a j
    #define b i
                                 {a,b}, {a,-b}, {-a,b}, {-a,-b}
    #undef a
    #undef b
                                 });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2018-10-02
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多