gpt4 book ai didi

c++ - 将链表从 C 传递到 C++

转载 作者:行者123 更新时间:2023-11-30 17:52:24 26 4
gpt4 key购买 nike

将链表从 C 代码传递到 C++ 是否存在已知问题?我有一个 Qt 对话,我正在将其添加到旧 C 代码中。 Qt 类(在 C++ 库中)调用 C 库函数,该函数返回指向链表的静态指针。该列表是在 C 库中创建的。例如:

C 代码:

typedef my_struct_s my_struct_t, *my_struct_p;
struct {
int some_data;
double some_more_data;
my_struct_p next;
} my_struct_s;
void create_list()
{
my_struct_p next;
SP_head = (my_struct_p) calloc(1, sizeof(my_struct_t));
next = (my_struct_p) calloc(1, sizeof(my_struct_t));
SP_head->some_data = 1;
next->some_data = 2;
SP_head->next = next;
}
static my_struct_p SP_head=(my_struct_p)0;

extern my_struct_p get_list() {
if(!SP_head)
create_list();
return SP_head;
}

C++ 代码:

myclass::do_something()
{
my_struct_p list = get_list();
for(my_struct_p ptr = list; ptr; ptr = ptr->next)
{
std::cout << ptr->value;
}
}

SP_head当我获得它时,它是有效的并且包含一堆条目。在我的调试器中,我可以看到下一个条目已填充,并且在从函数 get_list() 返回时有效。 .

当我尝试分配 ptr=ptr->next 时,无论是在 for 循环内部还是在 while 循环末尾或通过临时指针,该值都是 null 。即

temp_ptr = ptr->next;  
// temp_ptr is null
// but I can see ptr->next looks ok in a debugger

我现在已经更改了代码,将列表的每个元素复制到一个数组中并返回该数组,并且它工作正常。这是否与堆栈以及与 C 和 C++ 的不兼容有关,或者只是表明我在其他地方遇到了内存问题?

最佳答案

当然,C++ 已经准备好处理 C,那么您应该假设使用正确的接口(interface)时没有不兼容的情况。

毕竟,有许多软件是用 C 实现并通过 C++ 接口(interface)的。例如,我正在使用 SWI-Prolog - 从 Qt 用 C 语言实现。

但是为了编译你的代码,我必须做一些更改:这里是底线

文件 my_list.h

#ifdef __cplusplus 
extern "C" {
#endif

struct my_struct_s {
int some_data;
double some_more_data;
struct my_struct_s *next;
};
typedef struct my_struct_s my_struct_t, *my_struct_p;

void create_list();
extern my_struct_p get_list();

#ifdef __cplusplus
}
#endif

文件 my_list.c

#include "my_list.h"
#include <stdio.h>
#include <stdlib.h>

static my_struct_p SP_head=(my_struct_p)0;

void create_list()
{
my_struct_p next;
SP_head = (my_struct_p) calloc(1, sizeof(my_struct_t));
next = (my_struct_p) calloc(1, sizeof(my_struct_t));
SP_head->some_data = 1;
next->some_data = 2;
SP_head->next = next;
}

my_struct_p get_list() { return SP_head; }

文件main.cpp

#include "my_list.h"
#include <iostream>

class myclass {
public:
void do_something()
{
my_struct_p list = get_list();
for(my_struct_p ptr = list; ptr; ptr = ptr->next)
std::cout << ptr->some_data << std::endl;
}
};

int main() {
create_list();
myclass c;
c.do_something();
}

现在编译并运行:

g++ my_list.c main.cpp
./a.out
1
2

关于c++ - 将链表从 C 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com