gpt4 book ai didi

c++ - 你如何声明一个 extern "C"函数指针

转载 作者:可可西里 更新时间:2023-11-01 15:38:44 26 4
gpt4 key购买 nike

所以我有这段代码:

#include "boost_bind.h"
#include <math.h>
#include <vector>
#include <algorithm>

double foo(double num, double (*func)(double)) {
return 65.4;
}

int main(int argc, char** argv) {
std::vector<double> vec;
vec.push_back(5.0);
vec.push_back(6.0);
std::transform(vec.begin(), vec.end(), vec.begin(), boost::bind(foo, _1, log));
}

并收到此错误:

        return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
.............................................................^
%CXX-E-INCOMPATIBLEPRM, argument of type "double (* __ptr64 )(double) C" is
incompatible with parameter of type "double (* __ptr64 )(double)"
detected during:
instantiation of ...5 pages of boost

所以这个错误是因为 'log' 在 math.h 中是 extern "C"

我想知道如何在 foo() 中声明我的函数指针参数,以便它处理外部“C”函数。

最佳答案

您可以尝试包括 cmath相反,并使用 static_cast<double(*)(double)>(std::log) (转换为解决 double 过载所必需的)。

否则,您将限制您的功能为extern C功能。这会像

extern "C" typedef double (*ExtCFuncPtr)(double);

double foo(double num, ExtCFuncPtr func) {
return 65.4;
}

另一种方法是制作foo一个仿函数

struct foo {
typedef double result_type;
template<typename FuncPtr>
double operator()(double num, FuncPtr f) const {
return 65.4;
}
};

那你可以传foo()boost::bind ,并且因为它是模板化的,所以它会接受任何链接。它还适用于函数对象,而不仅仅是函数指针。

关于c++ - 你如何声明一个 extern "C"函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com