C 头文件中的内联函数[重复]

2023-12-26

我试图在网上搜索一个好的答案,但未能找到一个我可以完全理解的答案。假设我有一个标头“add.h”:

inline int add(int a, int b){ return a+b; }

名为“adddouble.c”的文件:

#include "add.h"

int adddouble(int a, int b){ return 2*add(a,b); }

名为“addsquare.c”的文件:

#include "add.h"

int addsquare(int a, int b){ return add(a,b)*add(a,b); }

主文件“main.c”:

#include<stdio.h>

int adddouble(int, int);
int addsquare(int, int);
int main(){
printf("add double = %d\n", adddouble(10,20));
printf("add square = %d\n", addsquare(10,20));
return 0;
}

我使用 gcc5.2.0 编译这些文件,但得到:“未定义的架构 x86_64 符号:”。如果我将 static 添加到 add.h 中的内联函数或 添加声明“extern int add(int, int);”到“adddouble.c”,它编译 成功无错误。我是内联函数的新手,我不知道如何解释和理解这种行为。谢谢


根据http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, 看起来像inline函数在 C 和 C++ 中的行为不同:

任何具有内部链接的函数都可以是内联函数。为一个 具有外部链接的功能,则适用以下限制: 如果 函数是用内联函数说明符声明的,那么它应该 也可以在同一个翻译单元中定义。如果所有文件范围 翻译单元中函数的声明包括内联 没有 extern 的函数说明符,则其中的定义 翻译单元是内联定义。内联定义可以 不提供函数的外部定义,并且不 禁止另一个翻译单元中的外部定义。内联 定义提供了外部定义的替代方案,其中 翻译器可以用来实现对同一函数中的任何调用 翻译单位。未指定是否调用该函数 使用内联定义或外部定义。 140)

如果你不放static在那里,您可以定义具有外部链接的内联函数,而无需实例化外部定义。

extern int add(int, int);实例化该函数的外部定义,您需要执行一次(无论在哪个文件中)才能成功链接(或者您可以标记内联函数static然后问题就消失了)。

(在 C++ 中inline创造weak每个翻译单元都有外部定义,因此您不必担心标记问题static或者为内联函数实例化一个外部定义——g++ 应该直接编译它for f in *.c; do g++ -c "$f"; done; g++ *.o没有任何问题。)

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

C 头文件中的内联函数[重复] 的相关文章

随机推荐

  • 在散点图中显示置信限和预测限

    我有两个身高和体重数据数组 import numpy as np matplotlib pyplot as plt heights np array 50 52 53 54 58 60 62 64 66 67 68 70 72 74 76
  • 比较将整数值转换为字符串的 3 种现代 C++ 方法

    我试图选择一个将积分转换为字符串的标准方法 http codexpert ro blog 2014 04 14 standard way of converting between numbers and strings in cpp11
  • 如何解决这些 Git GC 问题?

    我有一个反复出现的问题 我的 git 存储库 我认为 将决定它需要垃圾收集 此过程需要半个多小时 然后将在每次拉 推操作时触发 手动运行 Git GC 需要半个小时 但似乎并不能解决问题 我找到的唯一解决方案是删除我的存储库并重新克隆 由于
  • Bigquery sql:将 json 的键替换为列中存在的新值

    我在 Big Query 中有两个表 如图所示 table 1 有 id json 格式的属性 集合列 table 2 有 collection property key property name 列 我想将 table 1 中的属性列中
  • 使用 JSON 响应自动完成文本字段

    我想要的是 我想在我的应用程序中使用文本字段的自动完成 由于我的数据来自网络服务 我想使用 JSON 响应执行 自动完成 我知道的 我知道首先我必须从网络服务获取数据 然后我需要解析它并用解析后的数据填充数组 然后我可以使用该数组执行自动完
  • web.api 的 404 选项

    我已按照在 web api 中启用 cors 的常规步骤进行操作 但在 Chrome 和 Firefox 中收到对 OPTIONS 请求的 404 响应Cross Origin Request Blocked The Same Origin
  • 多对多关系以确定用户是否喜欢某个帖子

    我有一个包含所有帖子的表 我还有一个表 当用户喜欢带有外键 user id 和 post id 的帖子时 会在其中添加一行 我想检索一个列表ALL帖子的数量以及特定用户是否喜欢该帖子 使用外部连接 我最终得到了一些帖子两次 一次用于用户 1
  • 如何在 GitHub 上拥有带有公共问题跟踪器的私有存储库?

    我将向社区发布我的应用程序的一些测试版 项目存储在 GitHub 上的私有存储库中 我希望允许该社区报告错误并将其直接放在 GitHub 问题选项卡上 GitHub 目前尚未提供该选项 您知道如何覆盖此流程吗 截至 2019 年 9 月 不
  • Android ListView 不展开整个屏幕?

    我有以下活动
  • 如何更改导航视图项目文本大小?

    Google 最近发布 http android developers blogspot com au 2015 05 android design support library html the android support desi
  • 整数类型的最大值是否有常数?

    我正在为 VBA 代码寻找 c 中像 MAXINT 这样的常量 我只找到了其他语言的参考资料 找不到 VBA 的参考资料 如果没有这样的常量 VBA 中 int 可以容纳的最大数字是多少 我尝试了 2147483647 但出现溢出错误 VB
  • Firebase 自定义声明未在规则中更新[重复]

    这个问题在这里已经有答案了 我试图防止存储滥用 我的目标是限制每天的用户上传操作 因此 我部署了一个存储 onFinalize 触发器 一旦文件上传 该函数就会检测到使用 firestore 是否达到限制的计数器 如果是 将毫秒存储到 Cu
  • 基元/对象声明,默认初始化值

    声明基元 对象时 它们是否已初始化 哪些是默认值 行为是什么班级成员 and 当地领域 类成员的对象声明怎么样 如下回答 这些是默认值 Data Type Default Value for fields byte 0 short 0 in
  • 使用双值识别 SwiftUI TextField 中的更改

    我正在使用 TextField 让用户添加某物的价格 为了防止用户添加其他值作为数字 我将键盘类型更改为 decimalPad The stringValue每次角色更改时都会正确更新绑定 我现在的问题是doubleValue仅当用户按下回
  • JSP 中的美元大括号 ${} 是什么意思?

    什么是 在JSP中意味着什么 例如
  • ASP.NET动态添加列到Gridview

    如何根据条件动态向 GridView 添加一些列
  • 学习 HTML5 和 CSS3 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 想象一下今天 即 2011 年 3 月 1 日 某人从未编写过网页 并且想知道他们应该阅读哪些内容才能
  • 如何将 PyTorch 张量转换为 C++ torch::Tensor 反之亦然?

    我想使用 pybind11 在 C 模块中接收包含 PyTorch Tensor 的字典 并返回经过一些修改的结果字典 其中包含 C torch Tensor 返回 据我所知 似乎没有明确的方法将 PyTorch Tensor 转换为 C
  • 是否可以在 OS X 中设置 pthread CPU 关联性?

    In Linux有一个sched setaffinity 函数定义在sched h 但我似乎找不到类似的东西Mac OS X 10 6 pthreads实现 如果无法设置亲和力 则默认策略是什么OS X Mac OS X 有线程亲和性API
  • C 头文件中的内联函数[重复]

    这个问题在这里已经有答案了 我试图在网上搜索一个好的答案 但未能找到一个我可以完全理解的答案 假设我有一个标头 add h inline int add int a int b return a b 名为 adddouble c 的文件 i