2013-04-26 88 views
0

将C代码中的链表传递给C++有哪些已知问题? 我有一个Qt对话框,我将其添加到传统C代码中。 Qt类(在C++库中)调用C库函数,该函数返回指向链接列表的静态指针。该列表在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++不兼容,还是只是表明我在其他地方有内存问题?

+5

看到'my_struct'可能会有帮助,沿着其他typedefs。此外,你的代码看起来不正确('get_head()'应该返回'my_struct_p',而不是'my_struct'),这表明这可能不是真实代码,因此进一步使得准确的答案更加困难。一个[SSCCE](http://www.sscce.org)会非常有帮助,并且在写它时你可能会在没有任何帮助的情况下发现你的问题。最后,你在编译debug-no-optimizations吗?除非您准备好进入asm,否则不要信任发布代码上的调试器。 – WhozCraig 2013-04-26 17:08:17

+0

我看不到如何看my_struct会有所帮助。它只是一个带有下一个指针的普通旧结构。以上只是伪代码,是的,函数应该返回一个my_struct_p。当然,我正在编译我的调试模式,没有优化。问题在于是否存在与上述概念有关的已知问题。如果没有,那么我知道我需要在早期寻找一个bug。 – mike 2013-04-29 09:55:13

+0

编辑显示示例结构和用法 – mike 2013-04-29 10:04:06

回答

0

当然,C++是准备处理C,那么你应该假设有没有不兼容使用适当接口时。

毕竟,在C中实现了许多SW并且从C++接口。我正在使用,例如,SWI-Prolog - 以C语言实现 - 来自Qt。

但是编译代码,我不得不做一些变化:这里的底线

文件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; } 

文件为主。 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