<分区>
Possible Duplicate:
Inline functions vs Preprocessor macros
我想知道内联函数和宏函数的区别。
1) 内联函数和宏函数一样吗?
2) 我知道这两个都没有被调用但是它们在编译阶段被它的代码替换了。不是吗?
3) 如果有不同,能否具体说明?
<分区>
Possible Duplicate:
Inline functions vs Preprocessor macros
我想知道内联函数和宏函数的区别。
1) 内联函数和宏函数一样吗?
2) 我知道这两个都没有被调用但是它们在编译阶段被它的代码替换了。不是吗?
3) 如果有不同,能否具体说明?
最佳答案
内联用函数体替换对函数的调用,但是,内联只是对编译器的一个请求,可以忽略(您仍然可以将一些标志传递给编译器以强制内联或在 gcc 中使用 always_inline 属性)。
另一方面,宏在编译前由预处理器展开,所以它就像文本替换一样,宏也没有类型检查,内联函数是。 wiki里面有比较.
为了完整起见,您仍然可以使用宏来实现某种类型安全,例如使用 gcc 的 __typeof__
,以下代码生成几乎相同的代码,如果使用错误的类型,都会导致警告:
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
__attribute__((always_inline)) int max(int a, int b) {
return (a > b ? a : b);
}
注意:有时无类型宏正是所需要的,例如,看看如何 uthash使用宏使任何 C 结构可散列,而无需求助于强制转换。
关于c - 内联函数与宏函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13375288/