在C或C++定义接口(函数)时,有时会使用默认值,这本来是无可厚非的。因为使用默认值,可以简化调用。但在跨语言调用时,这往往会成为一个新的问题。在C#和QT中调用这样的DLL时就会有这样的问题。
我将的sum接口的第二个参数增加了一个默认值,新的接口如下。
EXPORT int sum(int a,int b=100);如果是按常规调用这个函数,我们写成sum(1)和sum(1,200)都是可以的,但是在作为接口导出为其他语言调用时,就得小心了。可能有人会这样调用。
#includesum(1)的结果,期望值应该是101的,可是结果却完全不是。下面是运行结果。 结果显示是-1202723262,这是一个极大的数字。如果多运行几次,会发现这个结果是变化的。那就说明,第二个参数默认值,在作为接口调用时将不在是默认,而是随机变化的。那怎么办呢?#include #include typedef int (*SumFunction)(int);//修改后的接口点int main(int argc, char *argv[]){ QLibrary library("../Release/Calculate"); library.load(); if (!library.isLoaded()) { qDebug()<<"Cannot load library."; return 0; } SumFunction sum=(SumFunction)library.resolve("sum"); if (sum) { qDebug()<<"sum="<
我们采用显示调用,将默认值也作为参数传入。修改后的代码如下。
#include运行结果如下#include #include typedef int (*SumFunction)(int,int);//显示调用接口点int main(int argc, char *argv[]){ QLibrary library("../Release/Calculate"); library.load(); if (!library.isLoaded()) { qDebug()<<"Cannot load library."; return 0; } SumFunction sum=(SumFunction)library.resolve("sum"); if (sum) { qDebug()<<"sum="<
sum(1,888),结果是889,正是我们所期的值。
我在项目开发时,就在这里着了道,开始时按正常的代码调用(以前的代码使用的是省去默认参数的接口)进行移值了,结果运行结果怎么做都不对,后来查看了接口文档,发现还有一个默认值,然后加进去,再次运行,一切正常了。
折腾了很久,总是找到了问题。在C#调用DLL时,也有碰到类似的问题。
总结了一下:
1.在调用DLL接口时,一定要采用全参调用(显式),不管有没有默认值。
2.移值以前的代码时,要注意语言的特性,尤其是在参数的数量和类型上。