And*_*.P. 7 c c++ cross-platform
考虑一个简单的示例类:
class BankAccount {
public:
BankAccount() { balance =0.0; };
~BankAccount() {};
void deposit(double amount) {
balance += amount;
}
private:
double balance;
};
Run Code Online (Sandbox Code Playgroud)
现在说我想将它包装在extern"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);
}
Run Code Online (Sandbox Code Playgroud)
这是便携式吗?类型无符号"unsigned long"是否足够大以容纳对象指针?这种方法还有其他问题吗?
提前感谢您的任何答案!
Pup*_*ppy 10
是啊.这不好.特别糟糕.unsigned long- 就是不行.返回一个正确的类型BankAccount*- 其他语言将在另一端看到它作为通用指针(如System.IntPtr),并且当二进制接口无论如何都不键入指针时,不需要返回无类型指针.
extern "C" BankAccount* CreateBankAccount() {
return new BankAccount;
}
extern "C" void deposit(BankAccount* account, double amount) {
account->deposit(amount);
}
Run Code Online (Sandbox Code Playgroud)
一个条件基本上看起来很好.尝试使用整数类型来保存指针并不是一个好主意 - 使用void*起来要好得多,因为根据定义,它是指针的宽度.
实际上,我认为@ DeadMG的答案比这更清晰.
Type-strong甚至比void*更好.
typedef struct BankAccountProxy * BankAccountPtr;
BankAccountPtr createBackAccount() {
BankAccount *b = new BankAccount();
return (BankAccountPtr) b;
}
Run Code Online (Sandbox Code Playgroud)