c++中的宏使用后缀加1来中断

Macros in C++ breaks with postfix increments

本文关键字:中断 后缀 c++      更新时间:2023-10-16

我需要一个工作的MAX宏(没有(!)声明主函数),其中分配'r'的数字'a'和'b'的最大值。这段代码在编译时中断。怎样才能解决这个问题?

#define MAX(x, y, r) ((x) > (y) ? (r = x) : (r = y))
int x = 10;
int y = 20;
int r;
MAX(x, y, r);

感谢收看!

UPD: Some revision to clear full task:

#import <iostream>
#define MAX(x, y, r) ((x) > (y) ? (r = x) : (r = y))
int x = 1;
int y = 1;
int r = 1;
int main()
{
    MAX(x++, y, r);
    std::cout << r;
    return 0;
}

这段代码的结果是1,需要是2。所以我需要宏中的另一个逻辑来考虑所有后缀增量

你不能在函数之外使用这个宏,因为它是一个任意表达式,这就是为什么你会得到一个错误。

只需将宏的调用移到函数作用域中,它就可以工作了:

#define MAX(x, y, r) ((x) > (y) ? (r = x) : (r = y))
int x = 10;
int y = 20;
int r;
int main()
{
    MAX(x, y, r);
}
然而,在这种情况下使用宏是不必要的(除非这只是学习宏用法的练习);使max成为一个函数(或者,更好的是,使用std::max)将是一个更好的和更少出错的方法。

这不起作用,因为您不能在文件范围内放置任意表达式。我有几个建议:

  • 不要使用全局变量,除非你真的,真的必须。

  • 不要使用宏,除非你真的、真的必须使用。

我会这样做:

int main()
{
    int x = 10;
    int y = 20;
    int r = std::max(x, y);
    //pass x, y and r as arguments to functions rather than using globals
}