如何解决将C ++对象包装在外部“ C”中
| 考虑一个简单的示例类:class BankAccount {
public:
BankAccount() { balance =0.0; };
~BankAccount() {};
void deposit(double amount) {
balance += amount;
}
private:
double balance;
};
现在说我想将其包装在外部\“ C \”中,以便可以从许多不同的编程语言(例如C#和Java)中调用它。
我尝试了以下似乎可行的方法:
// cbankAccount.h:
extern \"C\" unsigned long createBackAccount();
extern \"C\" void deposit(unsigned long bankAccount,double amount);
// cbankAccount.cpp
unsigned long createBackAccount() {
BankAccount *b = new BankAccount();
return (unsigned long) b;
}
void deposit(unsigned long bankAccount,double amount) {
BankAccount *b = (BankAccount*) bankAccount;
b->deposit(amount);
}
这是便携式的吗?
类型unsigned \“ unsigned long \”是否足以容纳对象指针?
这种方法还有其他问题吗?
预先感谢您的任何回答!
解决方法
是的这不好。特别糟糕。
unsigned long
-只是没有。返回正确键入的“ 3”-其他语言将在另一端将其视为通用指针(例如System.IntPtr),并且当二进制接口无论如何都不键入指针时,无需返回未键入的指针。
extern \"C\" BankAccount* CreateBankAccount() {
return new BankAccount;
}
extern \"C\" void deposit(BankAccount* account,double amount) {
account->deposit(amount);
}
, 一个附带条件基本上看起来不错。尝试使用整数类型来保存指针不是一个好主意-更好地使用void*
,因为根据定义,它是指针的宽度。
实际上,我认为@DeadMG的答案比这更干净。
, 类型强甚至比void *好。
typedef struct BankAccountProxy * BankAccountPtr;
BankAccountPtr createBackAccount() {
BankAccount *b = new BankAccount();
return (BankAccountPtr) b;
}
, 这不是可移植的,因为unsigned long
对于指针可能不够长。 Win64是发生这种情况的一个罕见平台。
最好使用ptrdiff_t
或void*
。
, 长度是否足够大(可能不是在x86-64上)可能取决于平台,另一种方法是使用swig之类的东西
, 我会使用void *而不是unsigned long。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。