3

我正在阅读有关 C/C++ 中的内联函数的信息:

http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc07cplr243.htm

对于以下代码:

inline.h:
   #include<stdio.h>

   extern inline void two(void){  // GNU C uses this definition only for inlining
      printf("From inline.h\n");
   }

main.c:
   #include "inline.h"

   int main(void){
      void (*pTwo)() = two;
      two();
      (*pTwo)();
   }

two.c:
   #include<stdio.h>

      void two(){
      printf("In two.c\n");
   }

输出如下:

   From inline.h
   In two.c

它说这个输出是通过“对内联关键字使用 gcc 语义”获得的。

如果其中一个版本被内联,如何决定调用 two() 函数的版本?

正如我从输出中看到的那样,内联版本是用 two() 直接调用的,即没有任何函数指针。然而,当使用函数指针时,将调用非内联版本。是否有解决此类呼叫的一般规则?

4

2 回答 2

0

使用函数指针时,可调用对象必须有地址。然后编译器必须给函数一个地址,因此它将解析为非内联地址。

我想一般规则是您不能使用函数指针调用内联函数,因此如果存在两个版本的函数,则在使用函数指针时将调用非内联函数。请注意,这inline只是编译器的提示,它可能会选择忽略它。因此,我不认为(如果我错了,请纠正我)你可以做任何事情来确保函数的内联版本将被调用。

当然,让两个函数命名相同可能是个坏主意。

编辑:启用优化标志可能会改变一些事情。即使使用函数指针,也可以调用内联版本。

于 2013-06-17T13:35:45.363 回答
0

是的,确实有规律。实际上,这正是您的建议。此编译器扩展允许单个函数的两个定义共存,并且编译器根据是否内联对函数的调用来选择要使用的定义。

特别是,这意味着第一个定义总是内联的,而第二个永远不会。因此,从给定的呼叫站点将使用哪一个仅取决于呼叫者的详细信息。在您的情况下,第一个调用是直接调用,第二个调用是通过指针。编译器决定内联第一次调用而不是第二次调用。这是 4 个可能的决定之一。

于 2013-06-21T07:24:03.053 回答