Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 外部风险_C_Inline_C11 - Fatal编程技术网

C 外部风险

C 外部风险,c,inline,c11,C,Inline,C11,我不明白为什么这是不可能的: inline void f(void) {} int main(void) { f(); } 答复来自: C99或GNU99: 内联:类似于GNU外部内联;没有显示任何外部可见的功能 已发出,但可能会调用一个,因此必须存在 问题1: 我所理解的是f不是外部可见的,对我来说,外部可见意味着我不能从另一个文件调用f,但这里我直接在main中调用它。有什么问题吗 解决方案 将定义放入.h文件中 inline void f(void) {} 并且声明只包含在一

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

inline void f(void) {}

int main(void)
{
    f();
}
答复来自:

C99或GNU99:

内联:类似于GNU外部内联;没有显示任何外部可见的功能 已发出,但可能会调用一个,因此必须存在

问题1:

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

解决方案 将定义放入.h文件中

inline void f(void) {}
并且声明只包含在一个.c文件中

问题2:

但我也可以做到:

该声明位于头文件中

extern inline void f(void);
这个定义只在一个.c文件中

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

外空fvoid{}

在任何其他.c文件中

如果我不使用正常的解决方案,并且按照我刚才写的那样做,风险有多大

编撰

gcc-std=c11

inline关键字允许您在所有翻译单位、TU、.c文件中显示函数定义,而不会导致多定义符号错误。如果您考虑到这个目的,那么在一个.c文件中有一个内联定义,并通过头声明在所有其他文件中引用它就没有多大意义了。在这种情况下,只需省去内联,它没有任何用途。而标头中的外部内联声明就更没有意义了


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

看到您不想使用静态的原因了吗?回答1:是的,就是这样做的。回答2:不,不要那样做。外部内联空洞fvoid;在头文件中没有意义。@DietrichEpp我试图理解为什么它没有意义,这有什么错?它与正确的解决方案有何不同,你能解释一下吗?thanks@Oleg,您看到我的答案了吗?内联修饰符通过在调用函数的每个位置嵌入函数体,可以消除执行时的调用/返回开销。由于编译器将在调用函数的每个位置嵌入函数体,因此完整的函数定义必须对编译器可见。为此,应该在头文件中定义函数。@user3629249,不,不是内联说明符减少了开销,而是定义是可见的,并且编译器决定内联它。关键字本身并不意味着编译器可以在同一TU中内联所有代码。似乎你把使用该关键字的意图与它的技术效果混淆了。
extern inline void f(void);
extern void f(void) {}