编译器如何决定是否应该考虑内嵌函数?
与链接不同的是,不存在“内联”冲突(同名声明可能有内联或不内联)。
例如,函数的多个声明可以是内联的,也可以是不内联的,例如:
inline static void test(); // declaration with inline
int main()
{
extern void test(); // declaration without inline.
test();
}
static void test() // definition does not have inline
{
}或
static void test(); // declaration without inline
int main()
{
test();
}
inline static void test() // but definition has inline!
{
}在每种情况下,test()是否内联?
我真正的问题是,编译器是如何发现函数应该内联的?它是查看最近的声明是否带有关键字内联,还是查看定义中是否包含关键字内联?
我试着在标准中搜索它,但是我找不到任何关于这种模糊的规则。在标准中,内联的定义似乎非常模糊。
(我最初认为应该有一条“规则”,即一旦函数被内联声明,所有相同名称的声明也必须内联。)
编辑:我基本上是在问编译器是如何解决多个同名声明的歧义的,其中只有一些声明包含内联关键字。
inline static void test() // definition with inline keyword
{
}
int main()
{
extern void test(); // declaration without inline
test(); // Does compiler consider inlining or not?
}发布于 2011-11-16 23:08:49
我真正的问题是,编译器是如何发现函数应该内联的?它是查看最近的声明是否带有关键字内联,还是查看定义中是否包含关键字内联?
通常,编译器根据(1)如果函数的主体在头文件中,以及(2)特定于编译器的经验规则来确定内联是否有净好处来决定是否内联函数。
inline关键字是用来提供帮助的,但是与register关键字非常类似,它在生成代码时并没有提供太多信息。相反,inline的意思只是“如果您不止一次看到这个定义(因为我把它粘在头文件中),就不要抱怨。”
“不要抱怨”就是为什么您的代码没有抱怨,尽管它可能应该。
如果要使用关键字,不将其放在前向声明中,而do将其放在定义中( do将定义放在标头中):
void test();
/* ... other declarations ... */
/* (in the same file) */
inline void test() { printf("inlined!\n"; }实际上,这样做是有原因的:您可能不希望将声明与实现混淆。
https://stackoverflow.com/questions/8160001
复制相似问题