gpt4 book ai didi

c++ - 是否可以在 C++ 中对 C 结构进行子类化并在 C 代码中使用指向该结构的指针?

转载 作者:IT老高 更新时间:2023-10-28 12:59:21 24 4
gpt4 key购买 nike

这样做有副作用吗:

C 代码:

struct foo {
int k;
};

int ret_foo(const struct foo* f){
return f.k;
}

C++ 代码:

class bar : public foo {

int my_bar() {
return ret_foo( (foo)this );
}

};

C++ 代码周围有一个extern "C",每个代码都在自己的编译单元中。

这可以跨编译器移植吗?

最佳答案

这是完全合法的。在 C++ 中,类和结构是相同的概念,除了所有结构成员默认情况下都是公共(public)的。这是唯一的区别。因此,询问是否可以扩展结构与询问是否可以扩展类没有什么不同。

这里有一个警告。 不保证从编译器到编译器的布局一致性。因此,如果您使用与 C++ 代码不同的编译器编译 C 代码,您可能会遇到与成员布局相关的问题(尤其是填充)。当使用来自同一供应商的 C 和 C++ 编译器时,甚至会发生这种情况。

在 gcc 和 g++ 中发生过这种情况。我参与了一个使用多个大型结构的项目。不幸的是,g++ 对结构的打包比 gcc 松散得多,这导致了在 C 和 C++ 代码之间共享对象的严重问题。我们最终不得不手动设置打包和插入填充,以使 C 和 C++ 代码对结构进行相同的处理。但是请注意,无论子类化如何,都可能发生此问题。事实上,在这种情况下,我们并没有继承 C 结构体。

关于c++ - 是否可以在 C++ 中对 C 结构进行子类化并在 C 代码中使用指向该结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/127290/

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