gpt4 book ai didi

c++ - 将引用用作数组/指针是否合法?

转载 作者:行者123 更新时间:2023-12-04 02:26:47 25 4
gpt4 key购买 nike

我的团队(包括我自己)是 C++ 的新手。我们新开发的一部分是一个 C++ 函数,它需要与一个以数组作为输入的 C 函数接口(interface)。类似以下构造的东西是为了实现这一点:

#include "stdio.h"

void the_c_function(double *array, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d: %g\n", i, array[i]);
}
}

void the_cpp_wrapper(double& dref, int len)
{
the_c_function(&dref, len);
}

int main()
{
const int LEN = 4;
double dbl_array[LEN] = { 3,4,5,6 };
the_cpp_wrapper(dbl_array[0], LEN);
return 0;
}

编译后,它按预期工作:它打印数组的内容:

0: 3
1: 4
2: 5
3: 6

但这对我来说几乎不合法,或者充其量应该被劝阻。

这是合法的 C++ 吗,即是否保证指向数组引用的指针指向原始数组?

有什么理由可以这样做而不是直接使用指针而不是使用引用作为中间值吗?

最佳答案

My team (including myself) is new to C++. ...

[...]

... something that should be discouraged.

您现在应该养成使用标准 C++ 库的习惯,在您的情况下最好的选择是 std::vector :

#include <stdio.h>
#include <stdlib>
#include <vector>

void the_c_function(const double *array, size_t len) {/*...*/}
void the_cpp_wrapper(const std::vector<double>& v)
{
the_c_function(v.data(), v.size());
}
// ----------------------------
int main()
{
const std::vector<double> dbl_array { 3,4,5,6 };
the_cpp_wrapper(dbl_array);
return EXIT_SUCCESS;
}

关于const double*你也应该更清楚与 double* ,C++ 故意希望您使用更冗长的 const_cast<double*>丢弃const -性。

如果你想“全力以赴”使用C++,你可以制作the_cpp_wrapper()使用模板更通用一些:

template<typename TSpan>
void the_cpp_wrapper(const TSpan& v)
{
the_c_function(v.data(), v.size());
}

使用此代码,您可以将任何内容传递给 the_cpp_wrapperdata()size()方法。 (请注意 TSpan“可以”是 std::span<int>,这可能会导致一些模糊的编译器错误;有一些方法可以解决这个问题,但更多的是 C++。)


没有直接关系,但您可能会找到 std::span 也很有用。

关于c++ - 将引用用作数组/指针是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66988477/

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