多个定义和仅标头库

2024-01-31

我有一个带有几个 c 和 h 文件的 C 程序。我决定将程序的一部分设为“仅标头”,因此我将代码从 c 移至 h。现在我遇到了多重定义问题,但我不知道为什么。例如。:

main.c includes utils.h
vector.c includes utils.h

我将 utils.c 中的所有内容移至 utils.h(当然,还从项目中删除了 utils.c)。 utils.h 开头为

#ifndef UTILS_H_
#define UTILS_H_

// and end with:
#endif

为了确保我的防护是独一无二的,我尝试更改它(例如:UTILS718171_H_),但它不起作用。

尽管如此,编译器还是抱怨:

/tmp/ccOE6i1l.o: In function `compare_int':
ivector.c:(.text+0x0): multiple definition of `compare_int'
/tmp/ccwjCVGi.o:main.c:(.text+0x660): first defined here
/tmp/ccOE6i1l.o: In function `compare_int2':
ivector.c:(.text+0x20): multiple definition of `compare_int2'
/tmp/ccwjCVGi.o:main.c:(.text+0x6e0): first defined here
/tmp/ccOE6i1l.o: In function `matrix_alloc':
ivector.c:(.text+0x40): multiple definition of `matrix_alloc'
/tmp/ccwjCVGi.o:main.c:(.text+0x0): first defined here
...

问题可能是这样的:所有 c 文件都被编译并获得自己的代码版本,然后在链接时会导致问题,但老实说我不知道​​如何解决这个问题。


如果您在头文件中定义变量并将标头包含在多个 c 文件中,则必然会出现多个定义错误,因为您破坏了一种定义规则(ODR),它指出一个定义中应该只有一个定义翻译单位(头文件+源文件)。

解决方案是:
您应该只定义一次出现多个定义错误的实体。
对于函数:
在头文件中声明函数原型(您将其包含在其他源文件中)并在中定义函数唯一的一个源文件。
对于全局变量:
您在头文件(包含在其他源文件中)中声明变量 extern,然后在中定义该变量唯一的一个源文件。

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

多个定义和仅标头库 的相关文章

随机推荐

  • 在 Mathematica 中使用图形通过交叉替换磁盘

    考虑以下列表 dalist 47 9913 11 127 208 47 5212 10 3002 208 49 7695 9 96838 160 48 625 12 7042 436 这些是屏幕上眼睛注视的坐标 在每个子列表中 1是 X 坐
  • 使用窗口关闭按钮完全关闭 OS X 应用程序

    当用户在运行时使用应用程序关闭文档窗口时 我需要完全关闭我的应用程序 目前 当他们单击窗口时 应用程序保持打开状态并显示其菜单栏 我阅读了适用于 iOS 的这篇文章 并在 plist 文件中添加了一个条目 http developer ap
  • 如何初始化静态 std::atomic 数据成员

    我想为名为的类生成标识符order以线程安全的方式 下面的代码无法编译 我知道原子类型没有复制构造函数 我认为这解释了为什么这段代码不起作用 有人知道如何让这段代码真正发挥作用吗 有替代方法吗 include
  • 如何在 DataTable.Select(Expression) 中使用 SELECT GROUP BY?

    我尝试通过从每个组中选择第一行来删除重复的行 例如 PK Col1 Col2 1 A B 2 A B 3 C C 4 C C 我想要一个回报 PK Col1 Col2 1 A B 3 C C 我尝试了以下代码 但它不起作用 DataTabl
  • 在 HTML 表格中显示嵌套数组

    这是一个简单的问题 我花了几个小时试图解决 我有一个数组 其中包含几个学生的信息以及他们在测试中得分的分数 总共有 8 个主题 每个主题有 5 个参数 该数组如下所示 Array Ron gt Array subject1 gt Array
  • 将长 xticks 分成 2 行 matplotlib

    我有以下 matplotlib 我想将 x ticks 分成 2 行而不是 1 行 因为有时它们太长 这就是为什么它们会遇到另一行 然后就无法读取 x ticks 请记住 X ticks 不是硬编码的 它们正在变化 所以 x 刻度并不总是相
  • NSSortDescriptor - 将 # 和数字推到列表末尾 - iphone xcode

    我有一个表格视图 显示按字母顺序排序的联系人并将其分为几个部分 我在用 NSSortDescriptor sortDescriptor NSSortDescriptor alloc initWithKey dataSource keyNam
  • 如何使用 Liferay Tomcat 减少部署时间

    我使用 Liferay 6 并结合 Struts2 我正在使用 Liferay Bundled Tomcat 7 它工作正常 我的问题是 每当资源 portlet xml 或 java 文件 发生更改以及单击 build xml 时 部署都
  • 我可以在 Visual Studio 中的代码块注释中添加链接吗?

    我可以在 Visual Studio 中的代码块注释中添加链接吗 例如 block 1 class class1 block 2 class class2 review class1 1 类 是 1 类的链接 提前致谢 You can bo
  • 如何知道我的代码在 IDE 中以“调试”模式运行?

    如何编写在 调试 模式下 例如在 Eclipse 中作为 调试为 Java 应用程序 调用 与在 运行 模式下 例如在 Eclipse 中作为 作为 Java 应用程序运行 调用 下运行时行为不同的代码 也就是说 例如 代码可以在 作为 J
  • React 路由器中的动态路径

    我正在尝试将我的网站从传统的网络应用程序方法迁移到基于反应的应用程序 在此过程中 我遇到了与网址相关的问题 在我的网站中 在服务器端我使用网址重写将 url 映射到正确的控制器的功能 但我无法弄清楚如何在反应路由器中处理这个事情 我当前的反
  • 在 ubuntu 上编译 C 代码时遇到问题。 (#包括错误)

    我正在尝试在最新版本的ubuntu上编译C程序 以便稍后将编译后的程序放在另一台机器上 但是 当我使用 gcc prog c o prog 编译时 出现错误 致命错误 asm page h 没有这样的文件或目录 以下是标题 include
  • 隐藏微调器中的第一个项目

    我在微调器上工作 微调器中有 5 个项目 我只想隐藏微调器中的第一个项目 不是删除 只是隐藏 问题是 当我单击微调器时 没有选择 api 获取的项目通过使用第一个 item id 我刚刚在微调器的第一个位置 0 处添加了空白字段 它工作正常
  • 如何在 PHP 中将“一周的第一天”设置为星期四

    我想将一周的第一天设置为星期四 而不是星期日或星期一 因为这是公司的截止日期 我已经有一个代码来确定日期的当前周数 但它从星期日或星期一开始 如何根据我的喜好修改这些 function findweek date monthstart da
  • 使用 Jasmine 监视可观察订阅的结果

    我正在 Jasmine 单元测试一个使用 Observables 的角度组件 我的组件有我正在测试的生命周期挂钩 ngOnInit this dataService getCellOEE this cell subscribe value
  • 如何在 Jest 单元测试中查看渲染的 React 组件是什么样子?

    我正在尝试对 React 组件进行测试 我需要检查渲染后的样子 尝试使用ReactDOMServer renderToString 但它失败了 这是代码 import NewRec from src components edit impo
  • sqlSave 错误

    我正在与sqlSave添加我的矩阵B看起来像这样 Noinscr 88877799 45645687 23523521 45454545 到 SQL 表 所以我运行以下命令 sqlSave channel b testsFelix dbo
  • C++ Windows 异步 IO 命名管道未收到第一条消息

    修改后的代码来自 使用重叠 I O 的命名管道服务器https msdn microsoft com en us library windows desktop aa365603 v vs 85 aspx https msdn micros
  • Swift 3:使用 NSCoder 解码值的安全方法?

    在 Swift 3 之前 您可以使用 NSCoder 解码布尔值 如下所示 if let value aDecoder decodeObjectForKey TestKey as Bool test value Swift 3 中建议的方法
  • 多个定义和仅标头库

    我有一个带有几个 c 和 h 文件的 C 程序 我决定将程序的一部分设为 仅标头 因此我将代码从 c 移至 h 现在我遇到了多重定义问题 但我不知道为什么 例如 main c includes utils h vector c includ