C内联函数的内外链接的区别

1.内联函数的内链接如inline static void fn(void) {} 没有任何限制(建议使用)

2.内联函数的外链接如inline void fn(void) {} 则有诸多限制,最易被忽略的便是内联函数的外链接的定义(不仅需要.h文件的替换体,还需要单独的.c文件存放extern inline void fn(void)的外部定义);另外,一个非 static 的内联函数不能定义一个非 const 的函数局部 static 对象,并且不能使用文件作用域的 static 对象。例如:

static int x;
inline void f(void)
{
    static int n = 1; // 错误:非 const 的 static 对象在非 static 的 inline 函数中
    int k = x; // 错误:非 static 的 inline 函数访问 static 变量
}

示例代码:

// file test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
inline int sum (int a, int b)
{
    return a+b;
}
#endif
 
// 文件 sum.c
#include "test.h"
extern inline int sum (int a, int b); // 提供外部定义
 
// 文件 test1.c
#include <stdio.h>
#include "test.h"
extern int f(void);
 
int main(void)
{
    printf("%d\n", sum(1, 2) + f());
}
 
// 文件 test2.c
#include "test.h"
 
int f(void)
{
    return sum(2, 3);
}

原文地址:https://www.cnblogs.com/catgo/p/9982345.html

时间: 2024-10-10 16:58:43

C内联函数的内外链接的区别的相关文章

深入探讨 内联函数和宏定义的区别

内联函数的执行过程与带参数宏定义很相似,但参数的处理不同.带参数的宏定义并不对参数进行运算,而是直接替换:内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数. 内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定:而带参数宏定义的参数没有类型的概念,只有在宏展开以后,才由编译器检查语法,这就存在很多的安全隐患. 使用内联函数时,应注意以下问题: 1)内联函数的定义性声明应该出现在

内联函数和宏定义的区别

内联函数和宏定义的差别是什么 版权声明:本文为博主原创文章,未经博主允许不得转载.

内联函数与宏定义的区别

内联函数与宏的区别: 内联函数与普通函数相比,可以加快程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中.而宏只是简单的字符替换. 内联函数要做参数类型检查,这是内联函数跟宏相比的优势. inline一般只用于如下情况: (1)一个函数不断被重复调用 (2)函数只有简单的几行,且不包含for.while.switch等语句. 一般而言,写小程序没有必要使用inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,应考虑使用inline

内联函数和宏定义的区别和联系

深入到计算机的本质,其实,很多东西还是细节需要深入分析的,比如我最近的一份工作 内联函数和宏很类似,都是以空间换时间,都能一定程度上加快程序的执行.而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的.而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销.你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题.当然,内联函数也有一定的局限性.就是函数中的执行代码不能太多了,如果,内联函数的函数体过

【C语言天天练(二一)】内联函数

        引言:调用函数时,通常会因为建立调用.传递参数.跳转到函数代码并返回等花费掉一些时间,C语言的解决办法是使用类函数宏.在C99中,还提出了另外一种方法:内联函数.         内联函数:把函数变为内联函数将建议编译器尽可能快速地调用该函数,至于建议的效果则由实现来定义.因此,使函数变为内联函数可能会简化函数的调用机制,但也可能不起作用.内联函数是通过编译器来实现的,而宏则是在预编译的时候替换. 创建内联函数方法:在函数声明中使用函数说明符inline. 内联函数的特点: 1.

内联函数对作用

一.什么是内联函数 内联函数必须是和函数体声明在一起,才有效.像这样的申明是没有效果的: Inline Tablefunction(int I) 编译器只是把函数作为普通的函数声明,我们必须定义函数体: Inline tablefunction(int I) {return I*I}; 这样我们才算定义了一个内联函数.我们可以把它作为一般的函数一样调用.但是执行速度却比一般函数的执行速度要快. 二.类中的内联函数 我们也可以将定义在类的外部的函数定义为内联函数,比如: Class TableCl

C++中对C的扩展学习新增语法——内联函数以及函数参数

内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个cpp包含时不会引起重定义. 如果出现连接错误: 使用第三方库,没有将其库代码配置到项目,所以导致编译器找不到实现(变量定义,函数定义) 本身自己只写了声明,根本没有定义实现. 变量本身.函数本身具有内部链接属性,此函数或者变量只能在当前文件访问. 函数参数 函数参数的作用 兼容C语言中不规范的语法

C++中的内联函数和C中的宏定义的区别

在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上“inline”关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里为12),而宏定义则不同. 在C中的宏定义: C语言使用的预处理器语句#define来提供宏,例如:#define SQUARE(X)  X*X,这里宏并不是通过值传递来实现的,而是通过文本替换来实现的. 内联函数和宏定义的区别用下面的代码来观察: //内联函数 inline double squar

关于内联函数的几点总结

为什么要引入内联函数(内联函数的作用) 用它替代宏定义,消除宏定义的缺点.宏定义使用预处理器实现,做一些简单的字符替换因此不能进行参数有效性的检测.另外它的返回值不能被强制转换为可转换的合适类型,且C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作. 1.内联函数与宏定义的区别: 内联函数在编译时展开,可以做一些类型检测处理.宏在预编译时展开:内联函数直接嵌入到目标代码中,宏是简单的做文本替换. C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能