没有“static”或“extern”的“inline”在 C99 中有用吗?

2023-12-01

当我尝试构建这段代码时

inline void f() {}

int main()
{
    f();
}

使用命令行

gcc -std=c99 -o a a.c

我收到链接器错误(未定义的引用f)。如果我使用,错误就会消失static inline or extern inline而不仅仅是inline,或者如果我编译-O(所以该函数实际上是内联的)。

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

如果翻译单元中函数的所有文件范围声明都包含inline不带函数说明符extern,那么该翻译单元中的定义就是内联定义。内联定义不提供函数的外部定义,并且不禁止另一个翻译单元中的外部定义。内联定义提供了外部定义的替代方案,翻译器可以使用它来实现对同一翻译单元中的函数的任何调用。未指定对函数的调用是使用内联定义还是外部定义。

如果我理解正确的话,一个定义了函数的编译单元inline如上面的示例所示,仅当存在同名的外部函数时,才会一致地进行编译,并且我永远不知道是否调用了我自己的函数或外部函数。

这种行为难道不是完全愚蠢的吗?定义一个函数有用吗inline没有static or extern在C99中?我错过了什么吗?

答案摘要

当然,我错过了一些东西,而且这种行为并不愚蠢。 :)

As 尼莫解释,这个想法是把定义函数的

inline void f() {}

在头文件中只有一个宣言

extern inline void f();

在相应的.c 文件中。只有extern声明触发外部可见的二进制代码的生成。而且确实没有什么用处inline在 .c 文件中——它仅在标头中有用。

As the 乔纳森的回答中引用了 C99 委员会的基本原理说明,inline都是关于编译器优化,要求函数的定义在调用处可见。这只能通过将定义放入标头中来实现,当然,标头中的定义不能在每次编译器看到它时都发出代码。但由于编译器并不强制实际内联函数,因此某个地方必须存在外部定义。


其实这个优秀的答案也回答了你的问题,我认为:

外部内联有什么作用?

这个想法是,“inline”可以在头文件中使用,然后在 .c 文件中使用“extern inline”。 “extern inline”只是指示编译器哪个目标文件应包含(外部可见)生成的代码的方式。

[更新,详细说明]

我认为 .c 文件中的“内联”(没有“静态”或“外部”)有任何用处。但在头文件中它是有意义的,并且它需要在某些 .c 文件中相应的“extern inline”声明才能实际生成独立代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有“static”或“extern”的“inline”在 C99 中有用吗? 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 通过css重新排列div

    我有三个 3 子 div 分别具有类 span2 span7 和 span3 当我的浏览器宽度低于 763px 时 我希望它按照 span2 span3 和 span7 的顺序排列 我将如何通过CSS做到这一点 这是我的初始代码 div c
  • 在启动期间从读取文件加载数据,然后处理新文件并从映射中清除旧状态

    我正在开发一个项目 在启动过程中 我需要读取某些文件并将其存储在地图的内存中 然后定期查找新文件 如果有 然后用此替换启动期间地图中内存中的所有文件新数据 基本上每次如果有一个新文件full state然后我想将内存中的映射对象刷新到这个新
  • PLSQL动态查询

    我有一个表 A 其中有列A它将表名作为值 所有这些表都有一个公共列C 我需要每个表的该列的最大值 我尝试使用动态 SQL 但出现错误 请建议 DECLARE query1 VARCHAR2 100 c table VARCHAR2 40 c
  • CSS 圆形边框填充动画

    我有一个 css 文件 它可以完美地制作圆形边框填充动画 其宽度和高度均为 100 像素 但我只需要在 50px 宽度和高度的圆圈中使用相同的动画 我尝试了很多次来最小化尺寸 但圆圈没有通过动画正确修复 请帮我缩小这个圈子 我的需求 宽度
  • 当我使用任务管理器终止程序时收到什么消息

    所以我有一个 C dll 在我的 C 应用程序中使用它来监视 Windows 消息 我想知道 WM CLOSE 和 WM QUERYENDSESSION 是否已发送 因为我无法从 C 应用程序中看到它们 如果我收到这些消息之一 我想对我的文
  • 如何在microsoft azure上的django项目中配置celery-redis?

    我在 azure 中部署了这个 django 定位器项目 我的 Redis 缓存主机名 DNS 是 mycompany azure microsoft net 我在 azure 中创建了它 但不确定在哪里可以找到 redis 服务器的密码
  • 无法在 PowerShell 中获取事件数据字段数据

    我正在尝试将事件 4625 中的特定数据字段 FailureReason 获取到 CSV 字段 我用以下代码分析了事件模式 Get WinEvent ListProvider Microsoft Windows Security Audit
  • 检测 kiosk 应用程序启动的 Citrix 会话的终止

    我正在开发一个信息亭应用程序 它为用户提供了 Citrix 连接的选择 其想法是 用户选择 kiosk 应用程序提供的连接 然后 kiosk 启动程序通过运行类似于以下内容的命令来启动所选连接 C Program Files Citrix
  • 在 pandas 数据框中插入缺少的工作日并用 NaN 填充它们

    我正在尝试在时间序列数据框中插入缺少的工作日 例如 import pandas as pd from pandas tseries offsets import df pd DataFrame 2016 09 30 10 2020 2016
  • 每次尝试在 Heroku 上部署可能的应用程序时,我都会收到此代码错误:代码:'ERR_DLOPEN_FAILED'

    我是 Heroku 的新手 目前正在使用 React Node js 构建一个应用程序 虽然我能够成功地将我的主分支推送到 Heroku 并且 Heroku 确认我的应用程序已成功部署 但是 尽管显示以下部署成功消息 部署到 Heroku
  • 使用 CSS3/JS 的 SVG 径向擦除动画

    How can i achieve a radial wipe animation in CSS3 or JS It s seems so simple but I can t figure it out 这是使用 jQuery 的基本方法
  • JQuery - Firefox 中的 $.ajax ContentType 问题

    我正在使用以下代码发出跨域 JSON 请求 ajax type POST crossDomain true contentType application json charset utf 8 data domain domain asse
  • 带视图的叠加选项卡栏

    我有一个UIViewController标签栏内 对于选项卡栏中的一个 VC 我允许界面随着设备旋转而旋转 挑战是 我想隐藏选项卡栏并调整内部视图的大小 我做了什么 1 被调用 void willAnimateRotation 在我的标签栏
  • 比 for 循环更有效的求和方法

    我有两个大小相同的列表 两者都包含数字 第一个列表是生成的 第二个列表是静态的 由于我有许多生成的列表 我想找出哪一个是最好的 对我来说 最好的列表是最等于参考的列表 因此我计算每个位置的差异并将其相加 这是代码
  • 在php上写入文件

    我想保留访问者的 IP 并将其保存在文件中 我尝试了 fwrite 函数 但我认为它是在文件上的先前 ip 上重写的 Example ip txt 为空 当我运行 write php 脚本时 在 ip txt 上我有 x x x x ip
  • 将 StackPanel.Visibility 绑定到其子级的 Visibility 属性

    我对数据绑定比较陌生 只是在阅读它 我想做的是 我有一个带有许多子控件的 StackPanel
  • 从模板函数返回 double 或complex

    我正在编写一些函数模板来重载 矩阵类的运算符 我对类型矩阵做了很多工作double and complex
  • 如何在 RStudio 中查看、打开和保存 .rdb 文件

    我可以按照指示将变量环境中 rdb 文件中的每个数据库视为 承诺 here 现在 我想编辑其中一个文件并保存它 我怎样才能做到这一点 我是 R 新手 在一次讨论中r pkg 开发 Ivan Krylov 提供了以下读取 RDB 数据库的函数
  • Powershell 将用户添加到组

    我正在尝试读取包含用户信息的 XML 文件 并根据该信息将用户添加到 Active Directory 组 到目前为止 我一直在查找错误消息 但没有任何帮助 这是将用户添加到组的代码 MyUsers xml Get Content e sa
  • 没有“static”或“extern”的“inline”在 C99 中有用吗?

    当我尝试构建这段代码时 inline void f int main f 使用命令行 gcc std c99 o a a c 我收到链接器错误 未定义的引用f 如果我使用 错误就会消失static inline or extern inli