C宏用于更复杂的function

我已经看过宏的简单例子,但是想知道更复杂的事情,比如使用if语句并重新分配给定的变量。 像这样的更复杂的表达式可以在宏中完成吗? 我有一个可以运行数十亿次的函数,所以让预处理器只是将代码放在那里而不是来回传递变量会很好。

说我有以下function:

int foo(int a, int b, int c){ if (a > 2) c = a; if (b > 3) c = b; return a + b + c; } 

我怎样才能把它变成一个宏?

请注意,宏与函数调用不同 – 宏实际上替换了使用它们的C源代码而不是调用和返回 – 因此可能会有很多意外行为! 您的示例可以像这样制作成宏:

 #define FOO(a,b,c)((a)+(b)+(((b)>3)?(b):((a)>2)?(a):(c))) 

但同样, 使用复杂宏时存在许多缺陷 ,例如不清楚的运算符优先级和重复的自动递增/递减运算符。

最好听取其他答案的建议,并使用替代策略而不是复杂的宏。

容易 – 不要使用宏 – 只需使用内联函数:

 __inline int foo(int a, int b, int c) { if (a > 2)  c = a; if (b > 3)  c = b; return a + b + c; } 

虽然您可以用宏替换您的function,但很可能它对性能没有任何影响。 任何合理的编译器都会将函数内联移动,如果它认为它有帮助的话。

如果看起来它应该是一个函数,那么使它成为一个函数。

编译器技术随着时间的推移变得足够好,所以你不必担心这样的事情。 相信你的编译器,你应该没问题。