C宏用于更复杂的功能

时间:2011-02-06 20:20:07

标签: c macros

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

说我有以下功能:

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

return a + b + c;  
}

如何将其变成宏?

4 个答案:

答案 0 :(得分:3)

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

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

但同样,有many pitfalls when using complex macros,例如运算符优先级不明确和重复的自动递增/递减运算符。

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

答案 1 :(得分:2)

简单 - 不要使用宏 - 只需使用内联函数:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果它看起来应该是一个函数,那就把它变成一个函数。

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