gpt4 book ai didi

c - 是否应该在每个声明中使用关键字 "inline"?

转载 作者:太空宇宙 更新时间:2023-11-04 01:39:37 25 4
gpt4 key购买 nike

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

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

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

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 还是查看定义是否包含关键字 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?
}

最佳答案

My real question is, how does compiler discover that the function should be inlined? Does it look at whether the most recent declaration bear the keyword inline or does it look at whether the definition has keyword inline or not?

通常,编译器决定是否内联函数基于 (1) 函数体是否在头文件中,以及 (2) 特定于编译器的经验法则,这些规则确定内联是否有净 yield 。

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

“不要提示”就是为什么您的代码不提示,即使它可能应该提示。

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

void test();

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

/* (in the same file) */

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

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

关于c - 是否应该在每个声明中使用关键字 "inline"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8160001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com