可能重复:
内联函数VS预处理程序
我想知道内联函数和宏功能之间的差异。
1)是内联函数是相同的宏功能的?
2)我知道,无论是不叫,但他们是通过其在编译阶段代码代替。 不是?
3)如果有差别,你能指定吗?
可能重复:
内联函数VS预处理程序
我想知道内联函数和宏功能之间的差异。
1)是内联函数是相同的宏功能的?
2)我知道,无论是不叫,但他们是通过其在编译阶段代码代替。 不是?
3)如果有差别,你能指定吗?
内联替换与函数体函数的调用,然而,内联仅仅是可忽略(你仍然可以通过一些标志编译器强制在线或使用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结构可哈希而不诉诸强制转换。
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++);
这可能并非您的本意。
宏是由预处理器取代的(实际的编译之前)的是不是在所有函数的声明。 实际编译阶段开始前宏是早已过去,而这一切仍然是他们的扩张(包括扩展到什么)。
内联函数,实际上符合语言功能 ,具有范围规则,变量声明,逻辑结构(环等),等等。 内联函数没有展开预编译步骤类似宏。 他们被编译 ,就像普通的代码,但随后可以被注入(由于缺乏一个更好的词)到编译代码,并根据需要进行了优化。
无inline
不一样macro
定义,宏preproccessed但直列只是指示编译器将整个身体在那里它被调用的函数。
把inline关键字任何函数定义之前仅仅是指示或要求,编译器可以自由选择是否将让那个内联函数或将其作为正常
宏替换: preprocessing phase
(即,在编译之前)
-输入文件test.c
Linux中结果文件test.i
内联替代: compilation phase