【发布时间】:2017-08-01 08:46:36
【问题描述】:
看完
我想知道以下解决方法是否可行,以及它在编译器级别的最深层含义是什么。
// foo.h
typedef struct foo
{
int i;
#ifdef __cplusplus
foo(int _i) : i(_i) {};
#endif
} foo;
// bar.c
#include "foo.h"
foo bar;
bar.i = 1;
// bar.cpp
#include "foo.h"
foo bar(2);
在我看来,这是利用“结构多态性”的一个很好的技巧,能够保持 C 遗留代码的可移植性,但我感觉在某种程度上我现在正在处理两个不同的 类型。
【问题讨论】:
-
您还使用两种不同的语言...您想达到什么目的?
-
如果您使用 C 编译器进行编译,则结构中没有 C++ 函数。如果你用 C++ 编译器编译,你就没有 C 结构。是的,你有 2 种完全不同的类型。
-
环境是一个自己的 C++11 库,除其他库外,它还依赖于旧的 C89 库。我的一些 c 文件是这个库的客户端,并且是 C11 编译的;示例结构将在我的库中大部分共享,我想确保它是完全相同相同的类型。
-
我认为当您使用 C++ 功能将 vtable 引入您的结构时,这可能最终会中断。
-
没有“变通方法”,C++ 不是 C,所以两个编译器会产生完全不同的输出。如果您询问这两个结构是否在内存中具有相同的 layout,我建议您自己使用打包指令来确保这一点。关于“结构多态性”,我什至不知道这在 C 中应该是什么意思。