C 是否应该使用关键字“;内联“;在每个声明中都要使用吗?

C 是否应该使用关键字“;内联“;在每个声明中都要使用吗?,c,gcc,inline,declaration,C,Gcc,Inline,Declaration,编译器如何决定函数是否应该考虑内联 与链接不同,不存在“内联”冲突(相同名称的声明可能具有内联或不具有内联) 例如,函数的多个声明可以是内联的,也可以是非内联的,例如: inline static void test(); // declaration with inline int main() { extern void test(); // declaration without inline. test(); } static void test() // def

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

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

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

inline static void test(); // declaration with inline

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

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

在每种情况下,test()都是内联的吗

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

我试图在标准中搜索它,但我找不到任何关于这种模糊性的规则。看起来内联在标准中的定义非常模糊

(我最初认为应该有一个“规则”,规定一旦函数被内联声明,每个同名声明也必须内联。)


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

inline static void test() // definition with inline keyword
{
}

int main()
{
    extern void test(); // declaration without inline
    test(); // Does compiler consider inlining or not?
}
我真正的问题是,编译器如何发现函数应该内联?它是查看最近的声明是否包含关键字inline,还是查看定义是否包含关键字inline

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

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

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

如果要使用关键字,不要将其放在转发声明中,do将其放在定义中(并且do将定义放在标题中):

这样做实际上是有原因的:您可能不想让声明和实现变得杂乱无章

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

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

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

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

如果要使用关键字,不要将其放在转发声明中,do将其放在定义中(并且do将定义放在标题中):


这样做实际上是有原因的:您可能不想将声明与实现混为一谈。

只是不用担心。把
inline
从你的代码中去掉,让编译器去做那些让你担心的事情。阅读以下内容:编译器可以自由地内联你没有标记为内联的内容,并且通常不会内联你告诉他们的内容。让编译器来做这个调用,如果你觉得有必要的话,就把它作为提示给人类(看,这个函数很有效,因为它得到了优化)。我不是问编译器是否会内联它。我在问编译器是否知道我在这种模棱两可的情况下内联的意图。这种歧义应该在标准的某个地方定义,但我似乎找不到。标准的相关部分是6.7.4/6。实际上,一个好的编译器对您的“内联意图”不太感兴趣,它将根据自己的规则内联或不内联,这很可能不受函数是否标记为内联的影响。将函数标记为内联的有意义的效果与内联无关。顺便说一句,在您的第一个代码片段中,
test
在第一个声明中有内部链接,在第二个声明中有外部链接,6.2.2/4被忽略,标识符仍然有内部链接。不用担心。把
inline
从你的代码中去掉,让编译器去做那些让你担心的事情。阅读以下内容:编译器可以自由地内联你没有标记为内联的内容,并且通常不会内联你告诉他们的内容。让编译器来做这个调用,如果你觉得有必要的话,就把它作为提示给人类(看,这个函数很有效,因为它得到了优化)。我不是问编译器是否会内联它。我在问编译器是否知道我在这种模棱两可的情况下内联的意图。这种歧义应该在标准的某个地方定义,但我似乎找不到。标准的相关部分是6.7.4/6。实际上,一个好的编译器对您的“内联意图”不太感兴趣,它将根据自己的规则内联或不内联,这很可能不受函数是否标记为内联的影响。将函数标记为内联的有意义的效果与内联无关。顺便说一句,在您的第一个代码段中,
test
在第一个声明中有内部链接,在第二个声明中有外部链接,这被6.2.2/4忽略,标识符仍然有内部链接。规则#1:如果函数体在头文件中。这条规则是绝对的
inline static void test() // definition with inline keyword
{
}

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

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

/* (in the same file) */

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