是否可以在C++中使用宏交换两个变量的出现?

Is it possible to swap the occurences of two variables using macros in C++?

本文关键字:两个 变量 交换 C++ 是否      更新时间:2023-10-16

我正在研究一个竞赛问题,我必须通过以下方式初始化一个向量:

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
});

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

PS :尽管Matteo Italia的回答在上述上下文中是绝对正确的,但我更感兴趣的是知道使用宏交换变量是否可能在C++中发生,以及如何,如果可能的话?

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

#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)(。

宏是邪恶的,在这种情况下不是一个好主意。然而,既然这似乎是众所周知的,而且这个问题更像是学术性质的:思考"定义"而不是"交换"。您既不能使用 "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
});