inline 决定内部链接吗?

2023-12-27

我正在尝试外部内联函数。我认为它应该如何工作:

//a.cpp
inline void f(int) {}
//b.cpp
extern void f(int);
int main() { f(4); }

但出现链接错误。然后通过阅读this https://en.cppreference.com/w/cpp/language/inline ("1)必须声明inline在每个翻译单元中。”)。我尝试过的:

//a.cpp
inline void f(int) {}
//b.cpp
extern inline void f(int);
int main() { f(4); }

仍然出现链接错误。但现在,尝试一些我不知道自己在做什么的事情:

//a.cpp
extern inline void f(int) {}
//b.cpp
extern inline void f(int);
int main() { f(4); }

有用。这里发生了什么事?添加前extern对一切,f in a.cpp有内部联系吗?

我正在使用 MSVC 2017 (v141)/permissive- and /std:c++17


我正在尝试外部内联函数。

没有理由使用extern有一个函数。看存储期限-联动 https://en.cppreference.com/w/cpp/language/storage_duration#Linkage。函数默认具有外部联动;为了没有外部链接,需要做一些特殊的事情(即将它放在匿名名称空间中或声明它static)。因此,内联函数的正常使用已经表现出外部链接,而不需要extern关键词。

我认为它应该如何工作:

//a.cpp
inline void f(int) {}
//b.cpp
extern void f(int);
int main() { f(4); }

然后通过阅读this https://en.cppreference.com/w/cpp/language/inline ("1)必须声明inline在每个翻译单元中。").

该参考文献是正确的,但请多查找一下它说的地方“内联函数的定义 [...] 必须存在于访问它的翻译单元中 [...]。”您的示例有一个声明f in b.cpp,但不是定义。如果你要打电话f from b.cpp,您需要该翻译单元中的完整定义,如下所示:

inline void f(int) {}

(这与存在于a.cpp.) 如果省略大括号,则有一个声明,但没有定义,因此调用是非法的f来自那个翻译单位。

基本上,在头文件外部定义内联函数确实很痛苦,除非您给它内部链接。这是因为使用内联函数的每个源文件都需要自己的函数体副本,这意味着如果更改函数,则需要在多个文件中进行更改。钱币。不要这样做。定义你的每一个inline头文件中的函数。如果您认为要在源文件中定义一个,您可能会误解什么“inline" means.


什么是“inline" mean?

就编译器而言,inline关键字(几乎)没有任何意义。它只是函数定义上的一个标志,传播到目标代码中,以便linker看到它。编译器处理该函数就像处理任何其他函数一样。该函数可以正常调用,也可以内联调用它——就像任何其他函数一样。

编译器可能会执行某些操作的一种情况inlineflag 是函数被声明的时间inline,已使用,但缺乏定义。这是一个可以在链接器接管之前捕获的错误。它不是have被编译器捕获,但它可以。 (如果没有被编译器捕获,它将被链接器捕获。)

进入链接阶段。当链接器看到inline标志,它暂停该函数的单一定义规则。链接器期望在编译器优化后仍然使用该函数的每个翻译单元中看到该函数的定义。它可以选择这些定义中的任何一个作为最终的实现。因此,所有定义都必须匹配。

就是这样。这inline关键字基本上意味着函数定义位于头文件中。它告诉链接器当该定义出现在多个翻译单元中时不要抱怨,因为这是预期的。

回到问题,看起来意图是宣布inline其定义仅出现在一个翻译单元中的函数。换句话说,该函数将被标记为在多个翻译单元中定义,但定义将仅在一个翻译单元中。即使不是完全矛盾,也有些不一致。

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

inline 决定内部链接吗? 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • Linq 使用 GroupBy 时, Include 不起作用

    包括 matchparticipants 不起作用 当我调试时它总是说 Null 但是当我将 GroupBy 放在注释中时 它工作正常 我正在使用代码优先的实体框架 4 3 1 实体 public class Match ScaffoldC
  • new[],delete[]复杂性

    我已经知道new 运算符首先分配内存 然后为每个元素调用构造函数 并且delete 运算符首先为每个元素调用析构函数 然后释放内存 因此 它们的时间复杂度都是 O n 但是 如果我有一个类 我没有为其定义任何构造函数 析构函数 那么复杂度仍
  • 快速从基类返回子类

    我试图允许超类中的方法返回子类的实例 以便我可以在父类和子类之间使用方法链接 但是 当我尝试链接这些方法时 出现错误 BaseClass 没有名为 someOtherChainableMethod 的成员 这是我的代码 class Base
  • httpurlconnection 在 Android 4.2 上非常慢

    我可以使用 httpurlconnection 成功连接 发送和接收数据 但在我的手机 三星 s4 4 2 和 android 4 2 模拟器上加载所有数据需要很长时间 但在 Android 2 3 x 模拟器上加载图片大约需要 1 2 秒
  • R - ggplot2 等高线图

    我正在尝试用 R 复制 Andrew Ng 在 Coursera 上的机器学习课程中的代码 因为该课程是在 Octave 中 基本上我必须为多项式正则化逻辑回归绘制非线性决策边界 p 0 5 我可以使用基础库轻松复制该图 contour u
  • jQuery UI:可拖动滚动问题

    我正在尝试使用 jQuery UI 构建一个可拖放的文件夹文件视图 但我遇到了一个问题 我认为这归因于助手 这是我的代码 The HTML div span Parent Directory 1 span div span class fo
  • C++ 对 vtable 的未定义引用

    我正在学习C 我正在尝试做一个练习 用单个函数定义纯虚拟类的多个实现 我在链接使用这些实现的类时遇到问题 gt BasicMath h lt ifndef BASIC MATH H define BASIC MATH H include
  • 为什么 Crashlytics 报告的崩溃次数比 Google Play Console 少得多?

    我在 Google Play 商店上发布了一款集成了 Firebase Crashlytics 的应用程序 我在 Google Play 控制台中看到 当我取消选择 从 Google Play 安装 过滤器时 出现了许多新的崩溃 属于 从
  • 命令行查找目录中的第一个文件

    我的目录结构如下 Directory1 file1 jpg file2 jpg file3 jpg Directory2 anotherfile1 jpg anotherfile2 jpg anotherfile3 jpg Director
  • 我如何检测双卡设备中哪个卡的新拨出电话?

    我知道我可以通过该接收器检测到新的拨出呼叫
  • 大文件上传期间 Grails 连接超时

    我想防止SocketTimeoutException如果用户尝试从我的 Grails Web 应用程序中的上传表单上传大文件 大约 1 分钟后就会发生这种情况 我知道这是 Tomcat 的问题而不是 Grails 的问题 但我在修改方面有点
  • 优化以通配符开头的 LIKE 表达式

    我在 SQL Server 数据库中有一个表 其中包含地址字段 例如 1 Farnham Road Guildford Surrey GU2XFF 我想在搜索字符串之前和之后使用通配符进行搜索 SELECT FROM Table WHERE
  • 项目文件夹中的 __init__.py 破坏了鼻子测试

    项目树 bar py test init py test bar py bar py def dumb true return True 测试 test bar py import bar def test bar true assert
  • Android:关闭/丢失蓝牙连接或文件接收 -> 执行某些操作

    我想编写一个应用程序 通过以下方式监视我配对的蓝牙连接 如果文件来自配对源 则应存储该文件 如果没有文件被传递并且蓝牙连接中断 我的应用程序将存储一个虚拟文件 存储文件效果很好 我的主要问题是如何在显示器上没有活动的情况下运行整个过程 我读
  • 使用 OpenStreetMap 获取给定 GPS 坐标集的国家/地区名称

    有谁知道是否有办法使用 OpenStreetMap 离线或 API 来获取给定的 GPS 坐标集的国家 地区名称 我对使用此处提到的 Google 或 Geonames API 不感兴趣 GPS 坐标的国家 地区名称 https stack
  • 更新会员属性。不支持的方法

    我已经尝试研究我收到的异常几个小时了 但没有任何进展 我只是尝试使用以下代码更新会员资料 MembershipUser user Membership GetUser username user IsApproved false Membe
  • iOS:Google 地图 API -markerInfoWindow 与markerInfoContents

    我浏览了谷歌地图文档 https developers google com maps documentation ios sdk reference protocol g m s map view delegate p html ada4
  • 使用较小的物理内存对 10 亿个整数进行排序

    想要对 10 亿个整数进行排序 而我的系统只有 1 GB RAM 最快 最有效的排序方法是什么 假设我们在文本文件中输入每行一个整数 我们使用java程序来排序 我指定了 RAM 因为我们无法将所有输入整数保存在 RAM 中 Update
  • 创建一个序列,其值是字符和数字的混合

    我正在使用 Postgres 9 1 并且想创建一个可以用作主键的序列 它应该如下所示 entity id seq X0001 X0002 X0123 and nextval entity id seq 会回来 X0124 知道如何以及是否
  • inline 决定内部链接吗?

    我正在尝试外部内联函数 我认为它应该如何工作 a cpp inline void f int b cpp extern void f int int main f 4 但出现链接错误 然后通过阅读this https en cpprefer