gpt4 book ai didi

c++ - 如何创建 C API 到 C++ 函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:30 24 4
gpt4 key购买 nike

我正在学习如何在 C++ 中生成随机数数组。我正在使用 std::vector 和 std::generate (我正在尝试使用现代惯用的 C++ - 不确定我做得如何)。

我想做的是将此函数公开给普通的旧 C 代码。如何使这个函数在 C 中可用?

代码如下。谢谢!

void RandomArray(std::vector<double> &data)
{
std::random_device rd{};
auto mtgen = std::mt19937{ rd() };
auto ud = std::uniform_int_distribution<>{ 1, 6 };
auto gen = [&ud, &mtgen](){ return ud(mtgen); };

std::generate(data.begin(), data.end(), gen);
}

最佳答案

您可以使用 extern "C" 语句使函数可链接到 C 代码。

但是我认为从 C++ 版本到 C 版本更难,它会像这样:

void RandomArray(std::vector<double> &data)
{
std::random_device rd{};
auto mtgen = std::mt19937{ rd() };
auto ud = std::uniform_int_distribution<>{ 1, 6 };
auto gen = [&ud, &mtgen](){ return ud(mtgen); };

std::generate(data.begin(), data.end(), gen);
}

extern "C" void RandomArray(double* data, size_t size)
{
std::vector<double> v(size);
RandomArray(v);
std::copy(std::begin(v), std::end(v), data); // need to copy out
}

就我个人而言,我会选择另一种方式,让 C 版本成为主要算法,并让 C++ 版本来调用它:

extern "C" void RandomArray(double* data, size_t size)
{
std::random_device rd{};
auto mtgen = std::mt19937{ rd() };
auto ud = std::uniform_int_distribution<>{ 1, 6 };
auto gen = [&ud, &mtgen](){ return ud(mtgen); };

std::generate(data, data + size, gen);
}

void RandomArray(std::vector<double>& data)
{
RandomArray(data.data(), data.size());
}

此外,如果不在每次调用该函数时都初始化随机生成器,速度会快很多。一种方法是使随机生成器静态。如果你需要线程安全,你也可以将它设为thread_local:

extern "C" void RandomArray(double* data, size_t size)
{
thread_local static auto mtgen = std::mt19937{std::random_device{}()};
auto ud = std::uniform_int_distribution<>{ 1, 6 };

std::generate(data, data + size, [&ud](){ return ud(mtgen); });
}

关于c++ - 如何创建 C API 到 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699877/

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