内联函数的一个定义是
如果函数是内联函数,则编译器会放置代码的副本 在编译时调用函数的每个点的函数 时间。
然后我的问题是:为什么我们需要将参数传递给内联函数?
E.g
void main()
{
int a = 10;
print(a);
}
inline void print(int a)
{
printf("%d",a);
}
根据上面的内联定义,应该没有编译时错误,因为编译器会将代码转换为类似的内容:
void main()
{
int a = 10;
printf("%d",a);
}
答案 0 :(得分:5)
您的结论是基于无效的前提。内联函数不是类似宏的工具,它将函数代码盲目地拼接到调用者的代码中。它们是对编译器的请求,如果可能的话,内联函数体,但保持函数调用/执行的正常语义。换句话说,假设代码是正确的,在内联和非内联调用之间,行为(当然除处理器和内存使用之外)应该没有可观察到的差异。
内联函数的这个定义允许它们用于避免与宏相关的许多问题,例如函数中定义的局部变量的冲突与调用者中的名称相同,或调用带有副作用的函数。参数(例如print(a++)
将与内联函数一起正常工作,但不能与宏一起工作。)
由于此设计,您提供的示例是编译时错误。
答案 1 :(得分:3)
内联功能是功能。因此,它们就像函数一样被编写和管理。
编译器可能会选择以不同的方式处理这些函数(可能会更加努力地内联这些函数),但用户的界面仍然是函数。
此外,无法保证编译器能够遵守内联请求。
如果inline
是一个函数,它必须在每个使用它的转换单元中定义,并且它不会给出多个定义链接错误,无论它是否可以被编译器内联。
来自 7.1.2函数说明符[dcl.fct.spec]
带有内联说明符的函数声明(8.3.5,9.3,11.3) 声明一个内联函数。内联说明符指示 实现内联函数体的替换 呼叫点优先于通常的函数调用机制。 执行此内联替换不需要实现 在通话点;然而,即使这种内联替换是 省略,7.1.2定义的内联函数的其他规则 仍然受到尊重。