c++中的宏使用后缀加1来中断
Macros in C++ breaks with postfix increments
我需要一个工作的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
}
相关文章:
- 增量运算符与后缀混淆
- 类成员和中断
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何在OpenSSL库的名称中添加后缀'd'?
- 我的代码运行良好,但在游戏循环中中断
- 使用带有MCP23017的 pigpio 进行中断读取
- 为什么我在 AVR 中的中断无法正常工作?
- C++17 十六进制浮点文字单精度后缀冲突?
- 使用 UDP 中断 while()-循环
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何在 CompleteAsyncIO 中访问 IOMemoryBufferDescriptor,该描述符通过中断 EP
- 如何为伺服电机创建中断或返回值?
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- 开关:无外壳中断
- 如何使用中断停止循环?
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 在 Ubuntu 中编译 SuiteSparse,在安装 CHOLMOD 时中断
- 在PROGMEM中添加更多数据会中断Arduino Mega 2560上的SPI传输
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- c++中的宏使用后缀加1来中断