为什么内联函数需要传递参数
Why does an inline function need pass arguments?
内联函数的一个定义是
如果函数是内联的,编译器会放置一个代码的副本 在编译时调用函数的每个点上的该函数 时间。
那么我的问题是:为什么我们需要将参数传递给内联函数?
例如
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 定义的内联函数的其他规则应 仍然受到尊重。
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类