我在.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
答案 0 :(得分:1)
仅允许在函数声明的参数列表中
如果你不想在标题中默认参数,你可以通过重载函数来完成你想要做的事情:
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);
默认参数值是函数签名的一部分,编译器不会将其放入函数代码中。