【问题标题】:Getting wrong value with #define function使用#define 函数获取错误值
【发布时间】:2014-11-17 20:23:07
【问题描述】:

一个函数以两种不同的方式定义,一种使用#define,另一种使用函数。但是对于输出,我得到了不同的值。

输出是3 -1

我想知道为什么使用F(x,y) 会产生不同的值。

#include<iostream>
#define F(x,y) y-x
using namespace std;

int F2(int x,int y)
{
    return y-x;
}

int main()
{
    int x=1,y=2, h=2;
    cout << F(x+h,y) << " " << F2(x+h,y) << endl;
    return 0;
}

【问题讨论】:

  • 可能(一些缺少的括号),一个常见的宏问题。 避免他们这样愚蠢的事情。
  • 这里的教训是......?
  • 与其对函数使用#define,不如使用内联函数,inline int F(int x, int y) {return y-x;} 你会得到更好的编译器诊断(比如,传入两个指针,可以在原始代码中编译成功#定义宏,但你可能并不真正想要)

标签: c++


【解决方案1】:

首先,您#define 不是一个函数,而是一个。宏执行直接文本替换,因此输出行相当于:

cout << y-x+h << " " << F2(x+h,y) << endl;

你现在能发现错误吗?

【讨论】:

  • 补充答案 - 这正是您总是将宏参数(如果您确实使用它的话)放在括号中的原因。
【解决方案2】:

使用#define 的经典问题,也是不鼓励使用宏的主要原因之一。请记住,宏只不过是文字替换,并考虑它扩展为:

cout << y-x+h << " " << F2(x+h,y) << endl;

y-x+hy-(x+h) 完全不同。

总是将宏参数的用法用括号括起来:

#define F(x,y) ((y)-(x))

【讨论】:

  • 这真的应该是@EugeneSh. 提到的,所以你可以正确地做(例如)F(x+h,y) * 3
  • @clcto 你完全正确,谢谢!看,这就是我避免使用宏的原因;)
【解决方案3】:

#define 是宏指令,而不是函数。它只是用宏体替换它的出现。如果这样做,您会看到F(x+h,y)y-x+h 替换,这显然不是您想要的。宏的规则是将所有参数和子表达式放入括号中,如下所示:

#define F(x,y) ((y)-(x))

为了得到正确的结果。 这样F(x+h,y)就会被((y)-(x+h))代替,正确

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2020-12-02
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多