内联函数VS宏函数[复制](inline function vs macro function [d

2019-08-02 17:13发布

可能重复:
内联函数VS预处理程序

我想知道内联函数和宏功能之间的差异。

1)是内联函数是相同的宏功能的?

2)我知道,无论是不叫,但他们是通过其在编译阶段代码代替。 不是?

3)如果有差别,你能指定吗?

Answer 1:

内联替换与函数体函数的调用,然而,内联仅仅是可忽略(你仍然可以通过一些标志编译器强制在线或使用always_inline属性与GCC)编译器的请求

在另一方面宏,由编译之前预处理程序扩展,因此它就像文本替换,还宏不是类型检查,内联函数。 有一个在比较维基 。

为了完整起见,你仍然可以有某种与宏类型安全的,使用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结构可哈希而不诉诸强制转换。



Answer 2:

1)号

2)在C A宏仅仅是编译器处理的源代码之前被扩展的文本。 inline关键字被用作提示,该功能可被内嵌放置,而不需要调用堆栈要建立的编译器。

因此,举例来说,可以说,你有代码以下两个片段(一宏,然后将内联函数):

#define MAX(x,y)     (x > y ? x : y)

inline int max(int x, int y) { return x > y ? x : y; }

当预处理程序发现了在代码中调用如下:

int highest = MAX (var_1, var_2);

它取代它

int highest = (var_1 > var_2 ? var_1 : var_2);

以上是什么编译器编译过程最终获得的,因此由MAX(X,Y)所限定的片段为MAX 更换 (VAR_1,VAR_2)。 当编译器发现函数调用

int highest = max (var_1, var_2);

然后函数“MAX”被调用。 你必须假定它被称为正常的方式,因为编译器可以自由地忽略你的“内联”的提示,并向函数调用通过正常的调用堆栈,而不是简单地把代码的功能它是地方遇到。

最后一个需要注意的有宏:因为它是所有文本替换,而不是代码替换,如果你做这样的事情:

int highest = MAX (v1++, v2++);

预处理器将展开到:

int highest = (v1++ > v2++ ? v1++ : v2++);

这可能并非您的本意。



Answer 3:

宏是由预处理器取代的(实际的编译之前)的是不是在所有函数的声明。 实际编译阶段开始前宏是早已过去,而这一切仍然是他们的扩张(包括扩展到什么)。

内联函数,实际上符合语言功能 ,具有范围规则,变量声明,逻辑结构(环等),等等。 内联函数没有展开预编译步骤类似宏。 他们被编译 ,就像普通的代码,但随后可以被注入(由于缺乏一个更好的词)到编译代码,并根据需要进行了优化。



Answer 4:

inline不一样macro定义,宏preproccessed但直列只是指示编译器将整个身体在那里它被调用的函数。

把inline关键字任何函数定义之前仅仅是指示或要求,编译器可以自由选择是否将让那个内联函数或将其作为正常

宏替换: preprocessing phase (即,在编译之前)

-输入文件test.c Linux中结果文件test.i

内联替代: compilation phase



文章来源: inline function vs macro function [duplicate]
标签: c macros inline