为什么内联函数需要传递参数

Why does an inline function need pass arguments?

本文关键字:参数 函数 为什么      更新时间:2023-10-16

联函数的一个定义是

如果函数是内联的,编译器会放置一个代码的副本 在编译时调用函数的每个点上的该函数 时间。

那么我的问题是:为什么我们需要将参数传递给内联函数?

例如

void main()
{
    int a = 10;
    print(a);
}
inline void print(int a)
{
    printf("%d",a);
}

根据上述内联定义,不应该有编译时错误,因为编译器会将代码转换为以下内容:

void main()
{
    int a = 10;
    printf("%d",a);
}

你的结论是基于一个无效的前提。内联函数不是盲目地将函数的代码拼接到调用方代码中的类似宏的工具。它们是对编译器的请求,要求尽可能内联函数体,但保持函数调用/执行的正常语义。换句话说,假设代码正确,内联和非内联调用之间的行为(当然,处理器和内存使用情况除外)应该没有可观察到的差异。

内联函数的这种定义允许使用它们来避免许多与宏相关的问题,例如函数中定义的局部变量与调用者中同名的局部变量的冲突,或者对参数中带有副作用的函数的调用(例如 print(a++) 将使用内联函数正常工作,但不能与宏一起使用)。

由于此设计,您提供的示例是一个编译时错误。

内联函数是函数。因此,它们像函数一样编写和管理。

编译器可能会选择以不同的方式处理这些函数(可能会更努力地内联这些函数),但与用户的接口仍保留为函数。

此外,不能保证编译器会接受内联请求。

如果inline函数,则必须在使用它的每个翻译单元中定义该函数,并且无论编译器是否可以内联它,它都不会给出多定义链接错误。

来自 7.1.2 函数说明符 [dcl.fct.spec]

带有内联说明符的函数声明(8.3.5、9.3、11.3) 声明内联函数。内联说明符指示 在 调用点优先于通常的函数调用机制。 执行此内联替换不需要实现 在通话时;但是,即使这种内联替换是 省略,7.1.2 定义的内联函数的其他规则应 仍然受到尊重。