是否应在每个声明中使用关键字“inline”?

时间:2011-11-16 23:04:35

标签: c gcc inline declaration

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

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

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

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?
}

1 个答案:

答案 0 :(得分:4)

  

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

通常,编译器根据(1)函数的主体是否在头文件中以及(2)特定于编译器的经验法则来决定是否内联函数,以确定内联是否有净收益。 / p>

inline关键字旨在提供帮助,但与register关键字非常相似,它在生成代码时实际上并没有提供太多帮助。相反,inline只是意味着“如果您不止一次看到此定义,请不要抱怨(因为我将其粘贴在头文件中)。”

“不要抱怨”这就是为什么你的代码不会抱怨,即使它可能应该。

如果您要使用关键字,将其置于转发声明中,执行将其置于定义中(执行将定义放在标题中:

void test();

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

/* (in the same file) */

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

实际上有理由这样做:您可能不希望使用实现来混淆声明。