外部内联函数
External inline functions gcc
我正在阅读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.hn");
}
main.c:
#include "inline.h"
int main(void){
void (*pTwo)() = two;
two();
(*pTwo)();
}
two.c:
#include<stdio.h>
void two(){
printf("In two.cn");
}
输出如下:
From inline.h
In two.c
它说这个输出是通过"使用gcc语义的内联关键字"获得的。
如果其中一个版本是内联的,如何调用two()函数的版本?
正如我从输出中看到的,内联版本是直接调用two()的,即没有任何函数指针。然而,当使用函数指针时,则调用非内联版本。有解决这类呼叫的一般规则吗?
当使用函数指针时,可调用对象必须有地址。然后编译器必须给函数一个地址,因此它将解析为非内联的地址。
我想一般规则是你不能使用函数指针调用内联函数,所以如果存在两个版本的函数,那么当使用函数指针时将调用非内联函数。注意,inline
只是编译器的提示,它可能会选择忽略它。正因为如此,我不认为(如果我错了请纠正我)你可以做任何事情来确保函数的内联版本将被调用。
当然,让两个函数命名相同可能不是一个好主意。
编辑:启用优化标志可能会改变一些事情。即使使用函数指针,也可以调用内联版本。
是的,确实有一个规则。事实上,这正是你所说的。这个编译器扩展允许一个函数的两个定义共存,编译器根据是否内联函数调用来选择使用哪个定义。
特别地,这意味着第一个定义总是内联的,而第二个定义永远不是。因此,从给定的调用站点使用哪一个完全取决于调用者的详细信息。在您的示例中,第一个调用是直接调用,第二个调用是通过指针调用的。编译器决定内联第一个调用而不是第二个调用。这是四种可能的选择之一。
相关文章:
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- C++:函数外部的超时功能
- 如何在函数外部访问函数中局部变量的值?
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 以延长构造函数外部 QT 对象的生存期
- 全局静态变量不"staying defined"函数外部
- C++ 函数外部丢失的指针对象
- 向量大小在构造函数外部恢复为 0
- 删除函数外部的实例化对象
- 在函数外部编写代码
- 为什么我不能添加到方法/函数外部的 ostringstream
- 用于在方法或函数外部声明的变量的内存
- SDL2 在函数外部加载字体会引发错误
- 如何在具有多态性的函数外部创建对象
- 在函数外部声明对象,将其作为引用传递,然后在函数内部创建它
- 向量未在函数C++外部更新
- 访问函数外部的堆栈对象
- 在c++中访问函数外部的数组
- 如何更新函数外部的数组(指向指针)