【发布时间】:2014-01-17 10:29:02
【问题描述】:
我正在编写一个使用一些简单的面向对象继承的 C 库,就像这样:
struct Base {
int x;
};
struct Derived {
struct Base base;
int y;
};
现在我想将 Derived* 传递给一个采用 Base* 的函数,就像这样:
int getx(struct Base *arg) {
return arg->x;
};
int main() {
struct Derived d;
return getx(&d);
};
这可行,当然是类型安全的,但编译器不知道这一点。有没有办法告诉编译器这是类型安全的?我在这里只关注 GCC 和 clang,因此欢迎使用特定于编译器的答案。我对看到一些使用__attribute__((inherits(Base)) 或类似的东西执行此操作的代码有模糊的记忆,但我的记忆可能是在撒谎。
【问题讨论】:
-
这可能是一个愚蠢的问题,但如果你真的想要 C++,为什么不使用 C++?而不是试图破解 C 做类似的事情,也就是说。这不像是同一个编译器不能通过开关翻转来处理两种语言。
-
@Damon 也许他没有可用的 C++ 编译器。如果他正在使用嵌入式设备,那么更改编译器可能绝非易事。
-
但是 GCC 和 Clang 都是 C/C++ 编译器。他们会做任何事情,这取决于您在命令行上提供的语言标准(或者只是源文件的名称,如果您不告诉编译器其他任何内容)。
-
@Damon 可能还有其他原因。公司规则或与其他工具的兼容性。
-
@Damon:我正在添加一个更大的、预先存在的 C 代码库。我宁愿把它全部保留 C.
标签: c inheritance gcc clang