我正在阅读C / C ++中的内联函数:
以下代码:
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()函数的版本?
正如我从输出中看到的那样,内联版本被调用,直接调用了两个(),即没有任何函数指针。然而,当使用函数指针时,将调用非内联版本。是否有解决此类呼叫的一般规则?
答案 0 :(得分:0)
使用函数指针时,callable必须有一个地址。然后编译器必须为函数提供一个地址,因此它将解析为非内联函数。
我认为一般规则是你不能使用函数指针调用内联函数,所以如果存在2个版本的函数,则在使用函数指针时将调用非内联函数。请注意,inline
只是编译器的提示,它可能会选择忽略它。因此,我不认为(纠正我,如果我错了)你可以做任何事情来确保调用函数的内联版本。
当然,有两个名为相同的功能可能是一个坏主意。
编辑:启用优化标志可能会改变一些事情。即使使用函数指针,也可以调用内联版本。
答案 1 :(得分:0)
是的,确实有一条规则。事实上,这正是你的建议。此编译器扩展允许单个函数的两个定义共存,并且编译器根据是否内联对函数的调用来选择使用哪个定义。
特别是,这意味着第一个定义总是内联,第二个定义永远不会。因此,从给定的呼叫站点使用哪一个将仅取决于呼叫者的详细信息。在您的情况下,第一个调用是直接调用,第二个调用是通过指针调用。编译器决定内联第一个调用而不是第二个调用。这是4个可能的决定之一。