使用c ++的.dll调用带有默认参数的函数

时间:2018-04-06 12:05:33

标签: c++ function dll

我在.dll的标题中定义了一个函数

void calculo(vector<double> A, vector<int> B, double &Ans1, double jj);
<。>在.cpp文件中,它定义如下:

void calculo(vector<double> A, vector<int> B, double &Ans1, double jj = 36.5);

我使用以下代码从另一个c ++代码调用此.dll:

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include "TEST_DLL.h"


typedef void(_stdcall *f_funci)(vector<double> A, vector<int> B, double &Ans1, double jj);

int main()
{

vector<double> A;
vector<int> B;
double ans1;
double teste;

HINSTANCE hGetProcIDDLL = LoadLibrary(L"MINHA_DLL.dll");
    if (!hGetProcIDDLL) {
        std::cout << "could not load the dynamic library" << std::endl;
        return EXIT_FAILURE;
    }


f_funci Resultado = (f_funci)GetProcAddress(hGetProcIDDLL, "calculo");
    if (!Resultado) {
        std::cout << "could not locate the function" << std::endl;
        return EXIT_FAILURE;
    }

Resultado(A,B, ans1, teste);

}

这样,如果我输入"jj"参数,该函数就可以工作。但是,因为它被定义为.dll中的标准输入,所以它也应该没有它,但如果我尝试它不编译。有没有一种方法可以在从.dll加载函数的过程中声明"jj"参数具有标准输入值?

尝试使用Resultado(A,B, ans1);进行编译会产生以下错误:

error C2198: 'f_funci': too few arguments for call

2 个答案:

答案 0 :(得分:1)

Default arguments

  

仅允许在函数声明的参数列表中

如果你不想在标题中默认参数,你可以通过重载函数来完成你想要做的事情:

void calculo(const vector<double>& A, const vector<int>& B, double &Ans1, const double jj);
void calculo(const vector<double>& A, const vector<int>& B, double &Ans1) { calculo(A, B, Ans1, 36.5); }

作为奖励评论,请通过常量参考传递vector,因为按值传递可能会产生潜在的昂贵复制费用。

答案 1 :(得分:-2)

尝试将标准参数值添加到函数指针类型声明:

typedef void(_stdcall * f_funci)(向量A,向量B,双&amp; Ans1,双jj = 36.5);

默认参数值是函数签名的一部分,编译器不会将其放入函数代码中。