首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用约定和语言绑定

调用约定和语言绑定
EN

Stack Overflow用户
提问于 2013-12-16 13:14:09
回答 1查看 131关注 0票数 1

对于如何最好地处理公共API中的调用约定差异并使其与绑定保持同步,我有点困惑。假设我正在编写一个通过共享对象库或DLL提供的C。现在假设我被告知不应该在Windows上使用默认的调用约定--也就是说,在Linux和其他Unixes上,我应该使用编译器(可能是cdecl)使用的标准调用约定,但是在stdcall上,我应该强制使用stdcall。因此,我在头中有一些#ifdef逻辑,可以根据需要设置正确的调用约定。库的C头必须处理这个问题,所以C公共API是可用的。

现在假设我想用另一种语言为我的库编写绑定。这意味着我也必须用该语言重写调用约定逻辑(取决于当前系统),这样绑定才能正确地映射到库。等等,所有的绑定。有些语言对此可能没有很好的(或任何)支持。

有什么更优雅的方法吗?我应该在任何地方使用默认的调用约定,并假设其他语言会为外部/导入函数选择正确的调用约定吗?我需要担心这些东西吗(我想是的)?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-12-16 14:36:06

许多语言使用内置或第三方库来简化对共享库的调用。这些库通常包括对两个调用约定的支持。这方面的一个例子是用于从java调用本机共享库的南国防军。尽管如此,如果您不想依赖于使用单个调用约定的其他语言,则可以实现包含两种类型函数的共享库,并具有初始化器,这些初始化器返回每个类型的适当绑定。例如,如果您的库有两个名为function1function2的函数,您可以这样实现它:

代码语言:javascript
复制
typedef struct
{
    int (*function1)(int a, int b);
    char* (*function2)(void);
}API;

//stdcall implementation
//these functions compiled to use stdcalling convention
int stdcall_function1(int a, int b)
{
    /*...*/
}

char* stdcall_function2(void)
{
    /*...*/
}

API getSTDCallInstance()
{
    API api;
    api.function1 = &stdcall_function1;
    api.function2 = &stdcall_function2;
    return api;
}

//cdecl implementation
//these functions compiled to use cdecl convention

int cdecl_function1(int a, int b)
{
    /*...*/
}

char* cdecl_function2()
{
    /*...*/
}

API getCDECLInstance()
{
    API api;
    api.function1 = &cdecl_function1;
    api.function2 = &cdecl_function2;
    return api;
}

如果以这种方式实现库,则加载语言可以使用适当的初始化程序获得包含正确实现的结构句柄。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20611840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档