使用宏作为C中的函数

时间:2013-02-17 05:06:50

标签: c macros c-preprocessor

我想输入一个执行按位计算的宏并交换两个变量

我没有在我的程序中一次又一次地输入该代码,而是决定使用宏作为

#define swapVars(p,a,b) {p=a^b;a=^p;b=^p;}

当我在代码中使用宏

int a = 10, b=19;
int swap_dummy = 0; //May contain anything
swapVars(swap_dummy, a, b);
printf("a = %d   | b = %d", a, b);

我在替换中遇到错误。宏定义错了吗? (顺便说一句,它应该是)。这种情况的正确宏是什么?

2 个答案:

答案 0 :(得分:3)

=^无效,您需要^=。虽然目前还不清楚为什么你在正常分配工作正常时会使用逐位xor。

但是真的看到你的问题的评论,为什么这根本不应该是一个宏。

答案 1 :(得分:2)

这个问题很像“如何以错误的方式解决我的问题?”。

您的宏似乎是xor swap的错误实现。我将尝试以正确的方式帮助您解决问题,而不是帮助您修复xor交换:尽管xor-swapping是一个有趣的概念,但它没有实际用途。你确定这不是一个不成熟的优化吗?

  1. 与临时变量交换不同,它不是惯用语。首先,如果您编写了临时变量交换,则不会遇到此问题。此外,如果您需要花时间向同事解释您的代码,那么您可能希望考虑对您的工作场所进行更重要的优化。
  2. 在这种情况下,它的定义不如典型的交换。在int值上使用xor可能会导致陷阱表示,例如负零。使用陷阱表示是未定义的行为。未定义的行为可能会导致程序以非常奇怪的方式发生故障。
  3. 编译器在编译更常见且定义良好的代码方面做得更好。让你的编译器为你做过早的优化。
  4. 关于inline关键字:提前停止优化。使用简单易读的代码使您的程序正常工作,以便您可以寻求我们的帮助。一旦有了可行的解决方案,必要时对其进行分析,以确定最重要的优化可能来自何处。