C和C++中,虽然都有inline关键字,但是使用方法上有一些区别。
static inline函数C和C++是相同的,实际上相当于static函数。
inline函数有以下区别:
1、C语言中inline函数一般定义在头文件中,但inline定义的作用只是提供一个内联版本,并不会自动提供非内联版本,需要在某一个.c中使用extern inline显式实例化非内联版本(强符号),否则使用时报错,因为找不到非内联版本。
C++中inline函数也一般定义在头文件中,但inline定义会在所有用到该函数但没有内联的.cpp中隐式实例化非内联版本(弱符号),链接时选择体积最大的版本链接(如果有强符号版本,则使用强符号版本),extern inline和inline含义相同,没有显式实例化语法。
// 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); // 提供外部定义
?2、C中非static的inline函数不能有非const的static变量,也不能访问函数外的static变量;C++中没有这个限制。
static int x;
inline void f(void)
{
static int n = 1; // 错误:非 const 的 static 对象在非 static 的 inline 函数中
int k = x; // 错误:非 static 的 inline 函数访问 static 变量
}
3、C++17中inline也可以用于全局变量、类static变量,表示此变量为弱符号,在C语言或C++17之前,此功能可用__declspec(selectany)或__attribute__((weak))实现。
参考资料:inline 函数说明符 - cppreference.com
|