首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中手动调用C++对象的初始化器

在C中手动调用C++对象的初始化器
EN

Stack Overflow用户
提问于 2014-11-20 18:24:20
回答 4查看 199关注 0票数 3

我正在开发一个用C++编写的小型应用程序,希望在我的平台上使用。不幸的是,我们的交叉编译工具链只(可靠)提供了一个C编译器。我看了这个应用程序,它相当简单,只在几个地方使用了C++特定的习惯用法,所以我想我只需要手工将它转换成C代码。

我碰到一条线,我不知道该怎么处理。代码使用Termios打开一个新端口来与TTY流对话,并使用new关键字初始化Termios结构。

代码语言:javascript
复制
termios *settings = new termios();

据我所知,new关键字除了分配适当的内存外,还调用对象的初始化器。在C中,在我用malloc分配内存之后,我可以手动调用初始化器吗?我需要吗?

我有一种感觉,我误解了一些显而易见的/基本的东西,或者我看错了。我不太习惯C++代码。

编辑:我似乎引起了一些混乱。上面的代码行是创建一个在termios.h中定义的新termios结构,它是C的大多数实现上的标准库的一部分。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-20 18:43:02

线

代码语言:javascript
复制
termios *settings = new termios();

termios对象分配内存并对其进行值初始化。因为termios是过氧化物酶,所以等价物C应该是

代码语言:javascript
复制
struct termios* settings = calloc(1, sizeof(*settings));

代码语言:javascript
复制
struct termios* settings = malloc(sizeof(*settings));
memset(settings, 0, sizeof(*settings));

当然,相当于delete settings的是free(settings)

票数 3
EN

Stack Overflow用户

发布于 2014-11-20 18:34:58

我建议创建一个函数

代码语言:javascript
复制
termios *new_termios()

这将将malloc与构造函数代码结合起来。之后,不要使用malloc来分配termios

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 18:35:01

“在C中,在我用malloc分配内存之后,我可以手动调用初始化器吗?

不幸的是你不能。

我需要吗?“

它实际上取决于termios对象的定义。基本上,malloc所做的只是分配一块内存。也就是说,它不像构造函数那样执行任何初始化和内部内存分配。

我在这种情况下所做的事情:

我通过不透明指针为我的C++对象创建C包装函数。例如,为了调用C++对象的构造函数,我将在一个.cpp文件中为C创建一个C++包装器:

代码语言:javascript
复制
void* create_termios() { return new termios(); }
void  destroy_termios(void *obj) { delete obj; }
// other wrapper functions for termios

然后我用C语言将这些函数与一个.h文件连接起来:

代码语言:javascript
复制
extern "C" {
    void* create_termios();
    void  destroy_termios(void *obj);
    // declare any other necessary wrappers
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27046806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档