首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该在每个声明中使用关键字“内联”吗?

应该在每个声明中使用关键字“内联”吗?
EN

Stack Overflow用户
提问于 2011-11-16 23:04:35
回答 1查看 196关注 0票数 1

编译器如何决定是否应该考虑内嵌函数?

与链接不同的是,不存在“内联”冲突(同名声明可能有内联或不内联)。

例如,函数的多个声明可以是内联的,也可以是不内联的,例如:

代码语言:javascript
复制
inline static void test(); // declaration with inline

int main()
{
    extern void test(); // declaration without inline.
    test();
}  

static void test() // definition does not have inline
{
}

代码语言:javascript
复制
static void test(); // declaration without inline

int main()
{
    test();
}  

inline static void test() // but definition has inline!
{
}

在每种情况下,test()是否内联?

我真正的问题是,编译器是如何发现函数应该内联的?它是查看最近的声明是否带有关键字内联,还是查看定义中是否包含关键字内联?

我试着在标准中搜索它,但是我找不到任何关于这种模糊的规则。在标准中,内联的定义似乎非常模糊。

(我最初认为应该有一条“规则”,即一旦函数被内联声明,所有相同名称的声明也必须内联。)

编辑:我基本上是在问编译器是如何解决多个同名声明的歧义的,其中只有一些声明包含内联关键字。

代码语言:javascript
复制
inline static void test() // definition with inline keyword
{
}

int main()
{
    extern void test(); // declaration without inline
    test(); // Does compiler consider inlining or not?
}
EN

回答 1

Stack Overflow用户

发布于 2011-11-16 23:08:49

我真正的问题是,编译器是如何发现函数应该内联的?它是查看最近的声明是否带有关键字内联,还是查看定义中是否包含关键字内联?

通常,编译器根据(1)如果函数的主体在头文件中,以及(2)特定于编译器的经验规则来确定内联是否有净好处来决定是否内联函数。

inline关键字是用来提供帮助的,但是与register关键字非常类似,它在生成代码时并没有提供太多信息。相反,inline的意思只是“如果您不止一次看到这个定义(因为我把它粘在头文件中),就不要抱怨。”

“不要抱怨”就是为什么您的代码没有抱怨,尽管它可能应该。

如果要使用关键字,将其放在前向声明中,而do将其放在定义中( do将定义放在标头中):

代码语言:javascript
复制
void test();

/* ... other declarations ... */

/* (in the same file) */

inline void test() { printf("inlined!\n"; }

实际上,这样做是有原因的:您可能不希望将声明与实现混淆。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8160001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档