gpt4 book ai didi

c - 外部内联风险

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

我不明白为什么这是不可能的:

inline void f(void) {}

int main(void)
{
f();
}

来自 extern inline 的回答:

C99 (or GNU99):

"inline": like GNU "extern inline"; no externally visible function is emitted, but one might be called and so must exist

问题 1:

我理解的是 f() 是外部不可见的,对我来说外部可见意味着我不能从另一个文件调用 f() ,但是我在这里直接在 main 中调用它。有什么问题吗?

解决方案

定义放在.h文件中。

inline void f(void) {}

并且只有一个 .c 文件中的声明

extern inline void f(void); 

问题 2:

但我也可以这样做:

这个声明在头文件中

extern inline void f(void);

而且这个定义只存在于一个 .c 文件中

extern void f(void) {}

现在我可以随心所欲地使用函数了,唯一的条件是不写

extern void f(void) {}

在任何其他 .c 文件中。

如果我不使用“正常”解决方案,而是按照我刚刚写的那样做,会有什么风险?

编译为

gcc -std=c11

最佳答案

inline 关键字允许您使函数的定义在所有翻译单元、TU(.c 文件)中可见,而不会导致“多个定义的符号”错误。如果您考虑到这个目的,那么只在一个 .c 文件中定义一个 inline 并在所有其他文件中通过 header 声明引用它就没有多大意义。在这种情况下,只需省略 inline 就没有用了。 (而且 header 中的 extern inline 声明更没有意义。)

对于可预见的情况,头文件中的 inline 定义避免在任何翻译单元中生成符号。所以这些不同的翻译单位不能互相冲突。当您的代码实际需要该符号时,此策略作为一个明显的限制。例如,如果您获取函数的地址,或者如果编译器出于某种原因决定他不能或不会“在线”使用函数的定义,就会出现这种情况。因此,您始终应该告诉编译器您要在哪个 TU 中发出符号。

关于c - 外部内联风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927637/

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