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

时间:2015-01-08 07:29:52

标签: c++ c

内联函数的一个定义是

  

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

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

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);
}

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

编译器可能会选择以不同的方式处理这些函数(可能会更加努力地内联这些函数),但用户的界面仍然是函数。

此外,无法保证编译器能够遵守内联请求。

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

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

  

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