c - 函数类似于 C 中的宏

标签 c macros c-preprocessor

我试图理解像宏这样的函数的概念,但是有几点让我感到困惑。例如说我们有:

#define Max(a,b)  ((a)>(b)) ? (a):(b))

我是这样调用它的

int i = Max(4,5);

这将计算等同于 a>b 的条件表达式?如果是则a,否则b。但是我对 Max 函数如何知道如何处理参数感到困惑。与实际函数不同,实现不是用调用程序中的代码编写的。 define 语句右侧的语句是否为我执行此操作?这对我来说只是一个新事物,我想确保我了解这里发生的事情。

像宏这样的函数的这个特殊部分让我很困惑。我知道这些类型的宏对于降低开销成本很有用,因为它们排除了节省堆栈内存的 JSR RTS 处理器指令。

最佳答案

#define Max(a,b)  ((a)>(b)) ? (a):(b))

是一个宏,除了在您的代码中进行简单的文本替换外,它什么都不做,这意味着在预处理过程中,这一行:

int i = Max(4,5);

变为:

int i = ((4)>(5)) ? (4):(5));

请注意,在使用像这样的宏时没有类型安全,并且在调试代码时您也会非常困难。好的经验法则是:如果可以用函数实现同样的效果,就不要使用宏:

int max(int a, int b) {
    return (a > b) ? a : b;
}

关于c - 函数类似于 C 中的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15575485/

相关文章:

c++ - 为什么 ARM 文档建议只有 4 个函数参数?有更多的特定性能成本吗?

c - 针对库编译时出现“ undefined reference ”错误

c - 为什么我总是看到多行宏包裹在(看似)毫无意义的循环中?

objective-c - 这个宏有什么问题吗?

c++ - 有没有办法在另一个#define 中执行#define?

c - 如何将链表复制到另一个列表中?

c - 将指针传递给函数不会改变它的值

Scala 宏和单独的编译单元

c++ - Boost.预处理器: BOOST_PP_EQUAL not working

c - 与类对象宏同名的类函数宏