【问题标题】:Understanding preprocessor directives in this case?在这种情况下了解预处理器指令?
【发布时间】:2011-02-08 06:55:50
【问题描述】:
#define swap(a,b,c)(int t;t=a;a=b;b=t;);
void main()
{
    int x=10,y=20;
    swap (x,y,int);
    printf("%d %d\n",x,y);
}

输出是什么,为什么?

【问题讨论】:

  • 在你的宏中哪里使用c?
  • 您的代码无法编译,不清楚您的问题是什么。

标签: c macros c-preprocessor


【解决方案1】:

最好像这样重写你的宏:

#define swap(a, b, type) \
        do { \
                type t = a; \
                a = b; \
                b = t; \
        } while (0)

【讨论】:

  • 不是“更好”,必要。 OP 的宏不应该编译。
【解决方案2】:

根据用法 以及宏中未使用c 的事实,宏中似乎存在拼写错误。而不是使用int,应该说c:

#define swap(a,b,c)(c t;t=a;a=b;b=t;);

事实上,虽然这个“修复”可以让您大致了解宏,但它不会编译。请参阅Peyman's answer,它告诉您如何正确编写它。

基本上,它看起来像是一种交换 a,b 类型为 c 的两个变量的方法。

在您的情况下,输出将是:

20 10

这种交换算法的工作方式很简单。基本上,您想将a 复制到b 和b 复制到a。但是,如果您只是将b 复制到a,您将丢失a,并且您将被困在b 的两个副本中。

不只是将b 复制到a,您首先将a 的副本保存到一个名为t 的临时变量,然后将b 复制到a,然后将t(保存a 的原始值)复制到b。完成后,您可以忘记t。

【讨论】:

  • 您不能将语句放在括号中,也不能在表达式中声明变量。宏需要做更多的工作。
  • @Chris:当然,你是对的。我会参考你的答案。虽然您的回答解释了如何编译,但我的回答更深入地了解了它的工作原理。
  • @Chris:显然,我的意思是 Peyman 的,而不是你的,因为你没有回答这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多