C++ 宏:绝对值?

1 c++ macros

愚蠢的问题。刚开始使用 C++ 宏,但不明白这里有什么问题。

#include <iostream>
using namespace std;

#define ABS(a) ((a < 0) ? (-a) : (a))

int main() {
    uint16_t a = 0xf0, b = 0xf8;
    cout << a << " " << b << " " << a - b <<" " << ABS(a - b) << endl;
    int c = a, d = b;
    cout << c << " " << d << " " << c - d << " " << ABS(c - d) << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

240 248 -8 -488
240 248 -8 -488
Run Code Online (Sandbox Code Playgroud)

尝试使用有符号和无符号,但宏结果始终相同。

Sam*_*hik 5

让我们来看看这个宏:

#define ABS(a) ((a < 0) ? (-a) : (a))
Run Code Online (Sandbox Code Playgroud)

让我们扩展这个宏的用法:

ABS(a - b)
Run Code Online (Sandbox Code Playgroud)

如果您继续逐字替换(因为这就是宏的工作方式)a-b在宏中随处可见a,这就是您得到的:

((a-b < 0) ? (-a-b) : (a-b))
Run Code Online (Sandbox Code Playgroud)

您几乎可以使用文本编辑器的搜索/替换功能来执行此操作。这个错误现在非常明显。

你的宏应该是:

#define ABS(a) (((a) < 0) ? -(a) : (a))
Run Code Online (Sandbox Code Playgroud)

(我添加了一组额外的括号,只是为了避免以后遇到更多麻烦)。