linux编译 __stdcall,Linux中有STDCALL吗?

#define _CRT_SECURE_NO_WARNINGS // disable marking use of strcpy as error.

#include

#include

#include

class ICdeclGreeter {

public:

virtual ~ICdeclGreeter(){}

virtual void setGreeting(const char *greeting) = 0;

virtual void greet() = 0;

};

class IStdcallGreeter {

public:

virtual __stdcall ~IStdcallGreeter(){}

virtual void __stdcall setGreeting(const char *greeting) = 0;

virtual void __stdcall greet() = 0;

};

class CdeclGreeter : public ICdeclGreeter {

public:

char *greeting;

~CdeclGreeter() {

if (greeting != nullptr) {

free(greeting);

puts("[CdeclGreeter] destroyed");

}

}

void setGreeting(const char *greeting) {

this->greeting = (char *)malloc(strlen(greeting) + 1);

strcpy(this->greeting, greeting);

}

void greet() {

puts(greeting);

}

};

class StdcallGreeter : public IStdcallGreeter {

public:

char *greeting;

__stdcall ~StdcallGreeter() {

if (greeting != nullptr) {

free(greeting);

puts("[StdcallGreeter] destroyed");

}

}

void __stdcall setGreeting(const char *greeting) {

this->greeting = (char *)malloc(strlen(greeting) + 1);

strcpy(this->greeting, greeting);

}

void __stdcall greet() {

puts(greeting);

}

};

typedef struct pureC_StdcallGreeter pureC_StdcallGreeter;

typedef struct pureC_StdcallGreeterVtbl {

void (__stdcall *dtor)(pureC_StdcallGreeter *This);

void (__stdcall *setGreeting)(pureC_StdcallGreeter *This, const char *greeting);

void (__stdcall *greet)(pureC_StdcallGreeter *This);

} pureC_IStdcallGreeterVtbl;

struct pureC_StdcallGreeter {

pureC_IStdcallGreeterVtbl *lpVtbl;

char *greeting;

int length;

};

/* naive attempt at porting a c++ class to C;

on x86, thiscall passes This via ecx register rather than

first argument; this register cannot be accessed in C without

inline assembly or calling a reinterpretation of byte array

as a function. there is no "This" argument in any of below. */

typedef struct pureC_CdeclGreeter pureC_CdeclGreeter;

typedef struct pureC_CdeclGreeterVtbl {

void (*dtor)(pureC_CdeclGreeter *This);

void (*setGreeting)(pureC_CdeclGreeter *This, const char *greeting);

void (*greet)(pureC_CdeclGreeter *This);

} pureC_CdeclGreeterVtbl;

struct pureC_CdeclGreeter {

pureC_CdeclGreeterVtbl *lpVtbl;

char *greeting;

int length;

};

void test() {

ICdeclGreeter *g = new CdeclGreeter;

g->setGreeting("hi");

g->greet();

IStdcallGreeter *g2 = new StdcallGreeter;

g2->setGreeting("hi");

g2->greet();

// we can pass pointers to our object to pure C using this interface,

// and it can still use it without doing anything to it.

pureC_StdcallGreeter *g3 = (pureC_StdcallGreeter *)g2;

g3->lpVtbl->setGreeting(g3, "hello, world!");

g3->lpVtbl->greet(g3);

g3->lpVtbl->dtor(g3);

free(g2);

/*

// cdecl passes this via ecx in x86, and not as the first argument;

// this means that this argument cannot be accessed in C without

// inline assembly or equivelent. Trying to run code below will cause a runtime error.

pureC_CdeclGreeter *g4 = (pureC_CdeclGreeter *)g;

g4->lpVtbl->setGreeting(g4, "hello, world!");

g4->lpVtbl->greet(g4);

g4->lpVtbl->dtor(g4);

free(g);

*/

delete g;

}

int main(int argc, char **argv)

{

test();

system("pause");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值