我需要从第三方来源调用函数。该函数需要以下类型的参数:
StructureName *(*parameterName)[]
在一个例子中,它被定义为指针数组:
StructureName * MagneticModels[1]
通过“&”传递给函数运营商。不幸的是,在Visual Studio 2013中无法编译:
Error C2664: (...) cannot convert argument (...) from 'StructureName *(*)[1]' to 'StructureName *(*)[]'
为了让它编译,我添加了一个新变量并将其传递给函数:
StructureName *(*variableName)[];
现在它编译没有错误但是我得到一个运行时错误,“variableName”被使用而没有被初始化。
我尝试了很多方法来初始化它,但我不是一个C ++开发人员,所以这是真正的考验,经过一天我没有得到任何结果。因此,我将不胜感激任何帮助或建议。
答案 0 :(得分:1)
如果函数需要StructureName *(*parameterName)[]
参数,那么将指向StructureName * MagneticModels[1]
数组的指针传递给此类函数的唯一方法是使用具有显式强制转换的&
运算符
foo((StructureName *(*)[]) &MagneticModels);
(通过对数组类型使用typedef
可以使其更具可读性。)
另一个漏洞是基于这样一个事实,即一个数组可以声明具有未知大小,然后定义具有特定大小。只要只有"未知的大小"声明在调用时已为编译器所知,它允许您在没有强制转换的情况下传递它
extern StructureName * MagneticModels[]; // declaration
void foo(StructureName * MagneticModels[]);
int main()
{
foo(&MagneticModels);
}
StructureName * MagneticModels[1] = { ... }; // definition
这个漏洞的适用性当然非常有限。
答案 1 :(得分:1)
在C中,以下代码是合法的(其中T
是您的结构名称或其他):
void foo( T *(*ptr)[] )
{ }
int main()
{
T *arr[1];
foo( &arr );
}
然而,该函数原型在C ++中是非法的(更不用说调用了)。
如果您正在尝试编写C代码,请确保调用C编译器,而不是C ++编译器。
如果您正在尝试编写C ++但是调用此函数(其标题必须用C编写,并且可能函数也是用C实现的),那么您将需要编写一个在C ++中具有合法原型的存根函数。
例如:
// stub.h
void foo2( T **ptr ); // preferably use "extern C" guards around this
和
// stub.c
#include "foo.h" // the troublesome function
void foo2( T **ptr )
{
foo( (T *(*)[]) ptr );
}
通过传递第一个元素的地址而不是整个数组的地址来调用此存根:
T * MagneticModels[1];
foo2( MagneticModels );