c - 内联函数与宏函数

标签 c macros inline

<分区>

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/

相关文章:

c - 如何检查共享内存是否为空?

c - 我们如何将包含预定义宏的字符串存储到 C 中的变量中?

ios - 仅为 Debug模式显示设置包

C++ 用静态内联声明模板函数有意义吗?

data-structures - 具有 native /语法/内联图支持的语言?

c++ - 如何在 C(++) 中定义自定义错误代码

c - 在 C 语言中,取消引用指向指向 int 的指针的指针与取消引用指向指向 char 的指针的指针是一样的吗?

c - Dns 协议(protocol)头

macros - Scheme的语法规则——在 `...`中混合不同的语法选择

html - Tumblr 静态页面,删除内联 CSS