【问题标题】:Operator overloading with macros in c++在 C++ 中使用宏进行运算符重载
【发布时间】:2024-04-12 00:50:02
【问题描述】:

您好,我有一个关于宏的示例程序,

#include<iostream>
#define ABS(a) (a) < 0 ? -(a) : (a)

int main(){
    printf("%d",ABS(-1));
    std::cout<<ABS(-1);
    return 0;
}

在上面的 prgram 中,我试图用 MACRO 中的 -1 替换,但如果我尝试用 printf 打印它,它会起作用!但如果我使用 cout 它会引发错误。我知道这与 " 运算符的重载有关,但我不知道确切的原因。请问有人可以解释吗?提前致谢。

编辑:

Severity    Code    Description Project File    Line    Suppression State
Error   C2678   binary '<': no operator found which takes a left-hand operand of type 'std::basic_ostream<char,std::char_traits<char>>' (or there is no acceptable conversion)  practice_project    C:\Users\source\repos\practice_project\Source.cpp   10  

这是具体造成的错误吗?所以我的问题不在于为什么我不应该使用 MACROS ,我的问题是为什么 printf 给了我答案,为什么不给 cout?

【问题讨论】:

  • "它抛出一个错误":请解释错误是什么。另外,不要将宏用于类似的事情。请改用函数模板。标准库中已经有一个实现,也称为std::abs
  • 从阅读错误信息开始。
  • 在编译器不像现在这样擅长优化的时候,像这样的宏就派上了用场。但是现在你想使用宏的情况真的很少见(例如,只为某些平台或编译器启用代码)。一般来说,如果你是 C++ 新手,你不应该使用它们。
  • @walnut 我知道我只是在尝试一些东西,我唯一想要的是它为什么会这样?并且错误与运算符重载本身有关??

标签: c++ macros printf operator-overloading cout


【解决方案1】:

宏在编译之前进行搜索替换,所以printf("%d",ABS(-1));变成printf("%d", (a) &lt; 0 ? -(a) : (a))std::cout&lt;&lt;ABS(-1);变成std::cout&lt;&lt;(-1) &lt; 0 ? -(-1) : (-1),然后编译就完成了。

&lt;&lt; 的优先级高于&lt;,因此std::cout&lt;&lt;(-1) &lt; 0 ? -(-1) : (-1) 等于(std::cout&lt;&lt;(-1)) &lt; 0 ? -(-1) : (-1)

printf 中,没有像printf 中的, 那样适用的规则,它是参数的分隔符而不是运算符。

【讨论】:

    【解决方案2】:

    明白宏是纯文本替换,所以 cout 变成:

    std::cout

    【讨论】:

    • 我很清楚这一点,但我想要的是为什么 cout 会抛出运算符重载错误以及为什么 printf 成功地给出了答案?
    最近更新 更多