【问题标题】:How to convert struct's function to C [closed]如何将struct的函数转换为C [关闭]
【发布时间】:2021-02-15 11:01:40
【问题描述】:

我正在使用 C++ 库,但由于某种原因,我必须转换为以下结构的 C。

我从 github 找到了一个 C++ 库,它有这样的结构:

struct BRIDGE_TREE
{
    ...

void SetBridgeIdentifier (unsigned short settablePriorityComponent, unsigned short treeIndex, const unsigned char address[6])
    {
        BridgeIdentifier.SetPriorityAndMstid (settablePriorityComponent, treeIndex);
        BridgeIdentifier.SetAddress (address);
        UpdateBridgePriorityFromBridgeIdentifier();
    }

..}

这个结构和函数在下面的函数中调用:

 STP_BRIDGE* STP_CreateBridge (unsigned int portCount,
                                  unsigned int mstiCount,
                                  unsigned int maxVlanNumber,
                                  const STP_CALLBACKS* callbacks,
                                  const unsigned char bridgeAddress[6],
                                  unsigned int debugLogBufferSize)
    {
STP_BRIDGE* bridge = (STP_BRIDGE*) callbacks->allocAndZeroMemory (sizeof (STP_BRIDGE)); 
    assert (bridge != NULL);
    ...
        bridge->trees [CIST_INDEX]->SetBridgeIdentifier (0x8000, CIST_INDEX, bridgeAddress);
    ..
    }

我怎样才能像这样在 C 中使用SetBridgeIdentifier 函数。我正在寻找解决方案很长时间。我是 C++ 新手。

【问题讨论】:

  • 您的意思是:您想用 C 重新编写库还是:该库可以用 C++ 编写,但您希望能够从 C 中使用它?
  • 不考虑库的关系,我不会转换库,我只是问如何将相应的struct函数转换为C。专注于没有图书馆的主要问题。
  • 我的问题不在于这是关于库还是只是一个功能。关键是您是否只想能够从 C 中调用函数,或者想用 C 重写函数。
  • 我想用C重写函数。我已经可以用C运行C++代码了。我的目标是学习如何用C编写函数
  • bridge->trees [CIST_INDEX]->SetBridgeIdentifier (0x8000, CIST_INDEX, bridgeAddress) 不调用void SetBridgeIdentifier (const BRIDGE_ID& newBridgeIdentifier)。那是两个不同的功能。你到底想转换什么?

标签: c++ c struct


【解决方案1】:

C++ 中的struct 与类相同。两者之间的唯一区别是,如果您不指定成员的可见性,它们将默认在类中的structprivate 中公开。这也延伸到继承;如果您不指定任何内容,则 struct 将从其基类公开继承,但 class 将私下继承。

所以选择基本上归结为惯例。您使用struct 来表示需要在逻辑上组合在一起的一组元素。当您对概念进行建模时,以及当该概念执行事情并承担责任时,您可以使用class

话虽如此,要在纯 C 中实现您的代码,您需要将方法实现为函数,并传递一个指向 struct 的指针,该指针将充当 this

这是一个简单的例子:

C++

#include <iostream>
using namespace std;
 
typedef struct sSOMETHING
{
  int Id;
  void SetId(int newId) { Id = newId; };
} Something;
 
int main()
{
    Something stInstance;
    stInstance.SetId(0);
    return 0;
}

这是如何在 C 中重构的:

#include <stdio.h>

typedef struct sSOMETHING
{
  int Id;
} Something;


void SetId(Something* something, int newId)
{
  something->Id = newId;
};
 
int main(void) {
    Something stInstance;
    SetId(&stInstance, 0);
    return 0;
}

如您所见,SetId 方法是从 Something 类中提取的,并创建了一个函数,将来自 struct 的指针作为参数。这样,您可以拥有多个 Something 实例,并且它仍然有效。

您提供的代码摘录不足以实现一个工作示例,也不是 StackOverflow 为您实现它的范围。我不知道STP_BRIDGE 做了什么,SetBridgeIdentifier() 引用了一个未知的BridgeIdentifier,而BRIDGE_TREE 不完整。

但这应该让你开始:

typedef struct sBRIDGE_TREE
{
  [...]
}
BRIDGE_TREE;

void SetBridgeIdentifier (BRIDGE_TREE* bridgeTree, unsigned short settablePriorityComponent, unsigned short treeIndex, const unsigned char address[6])
{
  SetPriorityAndMstid(bridgeTree, settablePriorityComponent, treeIndex);
  BridgeIdentifier.SetAddress(bridgeTree, address);
  UpdateBridgePriorityFromBridgeIdentifier(bridgeTree);
}

void SetPriorityAndMstid(BRIDGE_TREE* bridgeTree, unsigned short settablePriorityComponent, unsigned short treeIndex)
{
  [...]
}

void BridgeIdentifier.SetAddress(BRIDGE_TREE* bridgeTree, const unsigned char address[6])
{
  [...]
}

void UpdateBridgePriorityFromBridgeIdentifier(BRIDGE_TREE* bridgeTree)
{
  [...]
}

【讨论】:

  • 感谢您的回复。我更改了 SetBridgeIdentifier 功能,请再次检查。如何在我的代码中使用这些工具?
  • @ThomasSablik 当然,你是对的。感谢您的输入;英语不是我的母语。
  • "两者之间的唯一区别是,如果您不指定成员的可见性,则默认情况下,它们在结构中是公共的,在类中是私有的。" 这是不正确的。不仅是成员。这也是传承。但这是吹毛求疵。我放弃了你。
  • 吹毛求疵也没关系。我会编辑以确保我的答案尽可能完整和准确。
猜你喜欢
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多