【问题标题】:C++ macro: absolute value? [duplicate]C++ 宏:绝对值? [复制]
【发布时间】:2021-09-15 03:58:55
【问题描述】:

愚蠢的问题。刚开始使用 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;
}

输出如下:

240 248 -8 -488
240 248 -8 -488

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

【问题讨论】:

  • 欢迎来到 Stack Overflow。您已经发现了不使用宏的最大原因之一。你知道240 - 248 是什么;当你把'-'放在它前面会发生什么?
  • 确实,这不应该是一个宏开头。为什么不让它成为一个正常的功能呢?
  • @spectras 或只是 std::abs
  • 宏是邪恶的。是什么阻止了某人使用ABS('&amp;') 或 ABS(std::vector)?更喜欢使用库函数或内联函数。

标签: c++ macros


【解决方案1】:

让我们来看看这个宏:

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

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

ABS(a - b)

如果您继续逐字替换(因为这就是宏的工作方式)a-ba 出现在宏中,这就是您得到的:

((a-b < 0) ? (-a-b) : (a-b))

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

你的宏应该是:

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

(我多加了一组括号,以避免进一步的麻烦)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多