C语言inline函数(转)

原文链接:http://blog.csdn.net/yuan1125/article/details/6225993

1  inline只是个编译器建议,编译器不一定非得展开Inline函数。

例如:

Inline函数地址引用

inline在递归函数中使用

2  inline必须用于函数定义,对于函数声明,inline不起作用

例如:

inline max(int,int);  //没有Inline作用

只有 inline max(int a,int b)

{

......

}

才有用。

3  inline定义的函数 和 宏定义一样,只在本地文件可见。所以建议Inline定义的函数放在头文件中

4  gcc中的Inline函数法则

1. static inline --->编译器本地展开。

2. inline--->本地展开,外地为Inline函数生成独立的汇编代码

3. extern inline--->不会生成独立的汇编代码。

特性1.即使是通过指针应用或者是递归调用也不会让编译器为它生成汇编码,在这种时候对此函数的调用会被处理成一个外部引用

特性2.extern inline的函数允许和外部函数重名,即在存在一个外部定义的全局库函数的情况下,再定义一个同名的extern inline函数也是合法的。

extern inline的用处:

在一个库函数的c文件内,定义一个普通版本的库函数foo:

mylib.c:

void foo()

{

...;

}

然后再在其头文件内,定义(注意不是声明!)一个实现相同的exterin inline的版本:

mylib.h:

extern inline foo()

{

...;

}

那么在别的文件要使用这个库函数的时候,只要include了mylib.h,在能内联展开的地方,编译器都会使用头文件内extern inline的版本来展开。

而在无法展开的时候(函数指针引用等情况),编译器就会引用mylib.c中的那个独立编译的普通版本。

即看起来似乎是个可以在外部被内联的函数一样,所以这应该是gcc的extern inline意义的由来。

时间: 2024-12-28 21:36:36

C语言inline函数(转)的相关文章

gcc 编译器对 inline 函数的支持

C99版的C语言引入了inline关键字开始支持inline 函数,在这之前传统的C语言(C89)是没有inline 关键字的,也不支持inline 函数.不过大多数 C89 的编译器都将inline作为一种附加特性早早的就加进去了.gcc 也不例外,不过gcc增加inline特性时C99还没定型,gcc中inline 的语意与C99也有些许的区别.这里就主要说说gcc 中的inline 特性. 另外,本文只讨论C语言,C++标准中很早就支持inline,不过inline的语意C和C++ 是有细

C++经典问答 inline 函数

inline函数的作用是什么? 在某些情况下,inline函数能使受计算量限制的应用程序运行的更快. 从广义上讲,inline函数的背后的思想是在调用函数的地方插入该函数的代码. 关键字"inline"和"inlined"函数之间的联系是什么? 用关键字inline修饰的函数可能不被直接插入,而直接插入的函数也可能不被标明为inline,被直接插入的惟一确定方式是根本不存在的! 关于直接插入有什么特殊的规则吗? 1.任何包含inline函数用法的源文件都必须包含该函

inline函数的使用方法

 inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义如下: #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2)) 为什么要取代这种形式呢,且听我道来: 1. 首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中

inline函数

在C&C++中一.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义.表达式形式的宏定义一例:#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))取代这种形式的原因如下:1. C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等 一系列的操作,因此,效率很高,这是它在C中

转:C语言inline详细讲解

本文介绍了GCC和C99标准中inline使用上的不同之处.inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare). 从 inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了.所以inline关键字不应该出现

inline函数和一般的函数有什么不同

1.比如: 1 int g(int x) 2 { 3 return x + x; 4 } 5 6 int f() 7 { 8 return g(); 9 } 这样f会调用g,然后g返回x + x给f,然后f继续把那个值返回给调用者. 如果g是inline的话.f会被直接编译成. 1 int f() 2 { 3 return x + x; 4 } 相当于把g执行的操作直接融合到f里.这样减少了调用g消耗的时间,但同时也增大了f的尺寸. 这就是inline函数,也就是所谓的内联函数. 2.但是现在不

[C/C++基础] C语言常用函数sprintf和snprintf的使用方法

Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, -]) 用途:将一段数据写入以地址buffer开始的字符串缓冲区 所属库文件: <stdio.h> 参数:(1)buffer,将要写入数据的起始地址:(2)format,写入数据的格式:(3)argument:要写的数据,可以是任何格式的. 返回值:实际写入的字符串长度 说明:此函数需要注意缓冲区buffer溢出,要为写入的arg

C语言strlen()函数用法

C语言strlen()函数:返回字符串的长度 头文件:#include <string.h> strlen()函数用来计算字符串的长度,其原型为:unsigned int strlen (char *s);  s为指定的字符串 eg: #include<stdio.h> #include<string.h> int main() { char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/"; char

C语言_函数

函数 1.函数构成 int main(int argc, const char * argv[]) { // insert code here... return 0; } 返回值类型  函数名(函数参数) { 函数体语句: return 返回值: } 2.函数分类 1)标准函数 由官方或第三方库提供的函数,可以直接调用,无需实现: 2)自定义函数 由程序员自己实现的函数: 3.编写函数的步骤 1)声明函数 写在头文件 2)实现函数 写在原文件 3)调用函数 C阶段,一般在主函数调用 [注意事项