gpt4 book ai didi

c - 为什么内联函数需要 static 关键字?

转载 作者:行者123 更新时间:2023-12-03 02:41:50 24 4
gpt4 key购买 nike

如果我尝试编译以下 C 代码而不将函数声明为静态,则会收到链接器错误:

undefined reference to '_fun'

但如果我不使其静态,它就会起作用。在 C++ 中,无需 static 关键字即可正常工作。

// Doesn't work
inline int fun()
{
return 3;
}

// Works
static inline int fun()
{
return 3;
}

int main(int argc, const char * argv[])
{
printf("%i", fun());
}

最佳答案

inline 的要求C 中的内容由 ISO C 标准第 6.7.4 节定义。引用 N1256 中的此部分

Any function with internal linkage can be an inline function. For a function with external linkage, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition. An inline definition does not provide an external definition for the function, and does not forbid an external definition in another translation unit. An inline definition provides an alternative to an external definition, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition or the external definition.

据我所知,您的定义满足所有这些要求。这:

inline int fun()
{
return 3;
}

既是 fun声明,又是定义 。没有 inline关键字,它将具有外部链接。

棘手的部分是最后一句话:

It is unspecified whether a call to the function uses the inline definition or the external definition.

在这种情况下,没有外部定义。你没有说你正在使用什么编译器,但是 gcc -std=c99 -pedantic显然默认情况下选择使用外部定义,并且由于没有外部定义,因此您会收到链接器错误。 (如果没有 -std=c99 -pedantic ,则不会出现链接器错误,但这是因为 gcc 还实现了 inline 作为 C90 之上的扩展。)

如果您只想使用该源文件中的函数,您不妨添加 static无论如何,关键字都要给它内部链接。

实验表明,如果我使用 -O1 中的任何一个进行优化编译,您的程序可以正确编译、链接和运行。 , -O2 ,或-O3 .

C 标准中的脚注似乎暗示 gcc 的行为正确。同一部分中的示例具有类似的非 static inline函数定义:

inline double cels(double t)
{
return (5.0 * (t - 32.0)) / 9.0;
}

后跟:

Because cels has external linkage and is referenced, an external definition has to appear in another translation unit (see 6.9); the inline definition and the external definition are distinct and either may be used for the call.

该标准的意图似乎是,如果inline函数具有内部链接,它应该在使用它的源文件中定义一次,但如果它具有外部链接,则内联定义是必须出现在其他地方的非内联定义的替代。是否调用外部函数或扩展内联定义的选择由编译器决定。

与您的问题不直接相关的一些要点:

int fun()可能应该是int fun(void) 。空括号是合法的,但它们表明该函数采用未指定数量和类型的参数。 void指定它不带任何参数,这正是您想要的。

您需要#include <stdio.h>如果您要调用 print F;这不是可选的。

你不想要constargv的声明中。就此而言,由于您不引用命令行参数,因此可以编写 int main(void) .

关于c - 为什么内联函数需要 static 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438510/

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