Oracle Solaris Studio 12.2:C 用户指南

D.1.10 inline 函数

6.7.4 函数说明符

完全支持 1999 C ISO 标准定义的内联函数。

请注意,根据 C 标准,内联仅仅是对 C 编译器的建议。C 编辑器可以选择不内联任何内容,而编译对实际函数的调用。

仅当在 -xO3 或更高优化级别进行编译并且优化器的启发式算法判断这样有利时,Solaris Studio C 编译器才会内联 C 函数调用。C 编译器不提供强制内联函数的方法。

静态内联函数很简单。在引用处内联使用内联函数说明符定义的函数,或者对实际函数进行调用。编译器可以选择在每个引用处执行的操作。编辑器确定在 -xO3 及更高级别进行内联是否有益。如果内联无益(或在低于 -xO3 的优化级别进行内联),将编译对实际函数的引用,并将函数定义编译为目标代码。请注意,如果程序使用函数的地址,将在目标代码中编译实际的函数,而不进行内联。

外部内联函数较为复杂。有两种类型的外部内联函数:内联定义外部内联函数

内联定义是使用关键字 inline 定义的函数,不包含关键字 staticextern,并且显示在源文件(或包含的文件)中的所有原型也包含关键字 inline ,而不包含关键字 staticextern。对于内联定义,编译器不得创建函数的全局定义。这意味着对非内联的内联定义的任何引用都将是对在其他位置定义的全局函数的引用。换句话说,编译此翻译单元(源文件)所产生的目标文件将不会包含内联定义的全局符号。对非内联的函数的任何引用都将是对由其他某个目标文件或库在链接时提供的外部(全局)符号的引用。

外部内联函数由具有 extern 存储类说明符(即函数定义和/或原型)的文件范围声明来声明。对于外部内联函数,编译器将在生成的目标文件中提供此函数的全局定义。编译器可以选择内联对该函数的任何引用(该函数在提供其定义的翻译单元(源文件)中可见),也可以选择调用全局函数。

未定义依赖于函数调用实际是否内联的任何程序的行为。

另外需要注意的是,具有外部链接的内联函数不得声明或引用翻译单元任意位置处的静态变量。

D.1.10.1 Solaris Studio C 编译器针对内联函数的 gcc 兼容性

要从 Solaris Studio C 编译器中获取与大多数程序中外部内联函数的 gcc 实现兼容的行为,请使用 -features=no%extinl 标志。指定了此标志时,Solaris Studio C 编译器会将此函数视为已声明为静态内联函数。

当获取此函数的地址时,会发生此行为不兼容的情况。对于 gcc,这将是全局函数的地址;对于 Sun 编译器,将使用局部静态定义地址。