【发布时间】:2021-07-03 09:47:21
【问题描述】:
我的团队(包括我自己)是 C++ 新手。我们新开发的一部分是一个 C++ 函数,它需要与一个将数组作为输入的 C 函数接口。为了实现这一点,我们制作了类似于以下构造的东西:
#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++,即它是否保证指向数组引用的指针指向原始数组?
有什么理由为什么要这样做而不是直接使用指针而不是在中间使用引用?
【问题讨论】:
-
这不是指向引用的指针。您不能将指针指向引用。
&some_ref其中some_ref是一个引用创建一个指向任何引用所指的指针。 -
(我不知道你为什么要打扰 - 你的 C++ 可以直接调用
the_c_function而无需经过the_cpp_wrapper。) -
我相信这段代码是合法的,但你不应该使用它。相反,请使用
template <std::size_t N> void the_cpp_wrapper(double (&arr)[N]) { the_c_function(arr, N); } -
@NathanOliver:这只是在没有明确原因的情况下强制长度为编译时常量。
-
dref不是对数组的引用,而是对double的引用。&dref是double的位置。如果引用的double恰好是数组的第一个元素,那么&dref当然是该数组的第一个元素的位置。 (而且,正如已经指出的那样,整个舞蹈完全没有必要 - 只需the_c_function(dbl_array, LEN)。)