c++ - 如何防止 .h 文件中的多个函数定义

标签 c++

我有一个基础 Core.h 文件和许多其他 .cpp 和 .h 文件,比方说 - (a.cpp, a.h, b.cpp, b.h, c.cpp, c.h)

现在,我已将 Core.h 文件包含在所有 .h 文件(即 a.h、b.h 和 c.h)中。在 c.cpp 中,我包含了 a.h 和 b.h 文件。结果 Core.h 文件被包含了两次,我收到了类似的错误

/tmp/ccq7z6jY.o: In function `fileID2fileName(int)':
/home/Core.h:20: multiple definition of `fileID2fileName(int)'
/tmp/cciNkoqe.o:/home/Core.h:20: first defined here
/tmp/ccravW4I.o: In function `fileID2fileName(int)':
/home/Core.h:20: multiple definition of `fileID2fileName(int)'
/tmp/cciNkoqe.o:/home/Core.h:20: first defined here
/tmp/ccdUjOEu.o: In function `fileID2fileName(int)':
/home/Core.h:20: multiple definition of `fileID2fileName(int)'
/tmp/cciNkoqe.o:/home/Core.h:20: first defined here
collect2: ld returned 1 exit status

最佳答案

问题不在于守卫:他们不会在不同的翻译单元中提供帮助。

您需要:

  • 在 .cpp 文件中各定义一次函数,并且只在 .h 文件中声明它们
  • 在标题中内联定义它们
  • 在标题中定义它们static

正如 StackedCrooked 正确提到的那样,包括静态函数定义但不使用它会导致相应的编译器警告。

关于c++ - 如何防止 .h 文件中的多个函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25407905/

相关文章:

c++ - 检查串行端口信息/描述以验证正确的端口

c++ - 如何使用 boost::function 参数将 lambda 传递给重写方法?

C++ 开发环境 Eclipse

c++ - 如何将 std::chrono::duration 转换为双倍(秒)?

c++ - 在 Raspberry pi 上运行 OSX openFrameworks 项目的最简单方法是什么?

c++ - 我们如何使用抽象类作为函数返回类型?

c++ - 引用 VC++ 代码或转换为 DLL?

c++ - 在编译时使用枚举作为索引分配数组的值 (C++)

C++ 删除包含新结构数组的新结构数组的正确方法?

c++ - set 元素的 const 引用不保留信息