相关疑难解决方法(0)

没有"静态"或"外部"的"内联"在C99中是否有用?

当我尝试构建此代码时

inline void f() {}

int main()
{
    f();
}
Run Code Online (Sandbox Code Playgroud)

使用命令行

gcc -std=c99 -o a a.c
Run Code Online (Sandbox Code Playgroud)

我收到链接器错误(未定义引用f).如果我使用static inlineextern inline代替just inline,或者如果我使用-O(因此函数实际内联),则错误消失.

这种行为似乎在C99标准第6.7.4(6)段中定义:

如果转换单元中函数的所有文件范围声明都包含inline函数说明符extern,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.

如果我理解了这一切,inline那么如果还有一个具有相同名称的外部函数,那么具有上例中定义的函数的编译单元只会一致地编译,而且我永远不知道我自己的函数或外部函数是否被调用.

这种行为不是完全愚蠢吗?在inline没有staticextern在C99中定义函数是否有用?我错过了什么吗?

答案摘要

当然我错过了什么,行为并不愚蠢.:)

正如Nemo所解释的那样,我们的想法是定义函数

inline void f() {}
Run Code Online (Sandbox Code Playgroud)

在头文件中只有一个声明

extern inline void f();
Run Code Online (Sandbox Code Playgroud)

在相应的.c文件中.只有extern声明才会触发生成外部可见的二进制代码.确实没有inline在.c文件中使用 - 它只在标题中有用.

正如Jonathan的回答中引用的C99委员会基本原理所阐述的那样,inline所有关于编译器优化都需要在调用的站点上看到函数的定义.这只能通过将标题放在标题中来实现,当然,标题中的定义在编译器每次看到它时都不能发出代码.但由于编译器不是强制实际内联函数,因此必须在某处存在外部定义.

c inline c99

91
推荐指数
2
解决办法
3万
查看次数

内联函数的多重定义

我已经阅读了一些与此主题相关的帖子,但无法彻底理清我的疑问.这可能是一个非常天真的问题.

我有一个头文件inline.h和两个翻译单元main.cpptran.cpp.

代码详情如下

inline.h

#ifndef __HEADER__
#include <stdio.h>
extern inline int func1(void)
{ return 5; }

static inline int func2(void)
{ return 6; }

inline int func3(void)
{ return 7; }
#endif
Run Code Online (Sandbox Code Playgroud)

main.c中

#define <stdio.h>
#include <inline.h>
int main(int argc, char *argv[])
{
    printf("%d\n",func1());
    printf("%d\n",func2());
    printf("%d\n",func3());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

tran.cpp

//(note that the functions are not inline here)
#include <stdio.h>
int func1(void)
{ return 500; }

int func2(void)
{ return 600; }

int func3(void) …
Run Code Online (Sandbox Code Playgroud)

c inline

25
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×2

inline ×2

c99 ×1