【问题标题】:How to avoid class/variable redefinition in C++ header only libraries如何避免仅在 C++ 标头库中重新定义类/变量
【发布时间】:2020-10-27 04:58:15
【问题描述】:

我正在编写一个基于 OpenVPN3 的库,它是 C++ OpenVPN 客户端实现仅在标头中,没有 cpp 文件。因此,我不得不依赖只有一个 cpp 文件,即客户端本身,其中包含一个包含大量其他标头的标头。

问题是,正因为如此,我无法将代码分成多个 cpp 文件。我希望人们能够使用我的库,无论是由他们预编译还是编译,但它们不能在超过 1 个 cpp 文件中包含相同的头文件,或者在链接过程中会有很多重新定义。例如,标题中还有一些静态变量。

如果有人想看看添加到“主”头文件中的东西的数量:https://github.com/lucaszanella/libopenvpn3/blob/9b3440a736d90b671e9376d2d9e4911475e07112/src/OpenVPNClient.hpp

我知道有一些像 Asio 这样的库也是只有标头的,每个人都可以毫无问题地使用它们。

一些不重新定义类或函数的技术是转发声明它们但不给出定义,但这里的问题是使用我的库的人将不得不访问它的方法和所有内容。是否可以将我的方法与我的库在标题上使用的方法分开?

【问题讨论】:

  • 您应该能够使用通常的#ifndef fencing 防止重复导入。
  • 但这里的问题是使用我的库的人将不得不访问它的方法和所有内容。是否可以将我的方法与我的库在标题上使用的方法分开?你可能不想要标题。
  • 将标头中的变量标记为inline
  • @tadman 我正在处理大约 2 个包含相同标题的 cpp 文件。发生这种情况时,它们都定义了相同的静态变量等,这会导致问题
  • 发布一个最小的可重现示例(您的代码包含 openvpn 标头并导致问题)会改善问题

标签: c++ openvpn


【解决方案1】:

您可以将#pragma once 放在文件的最顶部以避免由于被定义两次而导致同一个类冲突

【讨论】:

    【解决方案2】:

    如果你不想重复导入,你可以像 tadman 说的那样: 在文件顶部

    #ifndef HEADER
    #define HEADER
    //code goes here
    #endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多