我将Visual Studio 2013与Visual Studio 2010编译器一起使用。
我在c++ / CLI项目中重新使用了一些c代码,并且遇到编译错误。
所有文件都在同一个项目中,所有主体文件均未使用预编译的头文件
如果可能,我正在尝试不编辑已重用的代码...
这是代码示例,请注意libFunc.h和.c是重复使用的代码,我正在编写wrapper.cpp:
// libFunc.h
typedef struct
{
double max;
double var;
} myStruct;
void libFunc(char * filename, myStruct *(*arg)[]);
void readVals(char * filename, myStruct *(*arg)[]);
void assignVals(myStruct *arg, char vals[][1024]);
// libFunc.c
void libFunc(char * filename, myStruct *(*arg)[])
{
readVals(filename, arg);
}
void readVals(char * filename, myStruct *(*arg)[])
{
char vals[15][1024];
char *line = (char *) malloc(1024);
s = fopen(filename, "r");
while(fgets(line, 1024, s) != NULL)
{
// parse tokens into vals
assignVals((*arg)[index], vals);
}
}
void assignVals(myStruct *arg, char vals[][1024])
{
arg->max = atof(values[0]);
arg->var = atof(values[1]);
}
// wrapper.cpp
#include "libFunc.h"
int wrapper()
{
myStruct *myVar[1];
char filename[512];
strcpy(filename, "input.txt");
libFunc(filename, &myVar);
}
我得到错误:
cannot convert myStruct *(*)[1] to myStruct *(*)[].
我试过了:
myStruct ** myVar = new myStruct*[1];
libFunc(&myVar);
这导致了错误:
cannot convert myStruct *** to myStruct *(*)[].
我如何传递它会接受的东西?
该代码不必编译为c++
此问题的任何解决方案都必须在带有Visual Studio 2010编译器的Visual Studio 2013中工作,通过“工作”,我的意思是“构建解决方案”必须构建包括这些c文件在内的所有内容。
最佳答案
有人说C是C++的子集。这是不正确的。正确的是,存在两种语言都通用的子集。您正在遇到C++不支持的C方面之一。
由于C++不支持此功能,因此任何答案的质量都是可疑的。就是说,这是一个质量可疑的答案:只需将&myVar
转换为指向myStruct
的指针数组的指针即可:
libFunc((myStruct*(*)[])&myVar);
这样编译干净。是否“有效”,这是另一个问题。这个问题中有一条评论使我认为这行不通:
如果该函数确实做到了
set arg
(而不是 sets contents of arg
),那么C++根本不支持该功能。除了:为什么该函数需要一个指向
myStruct
的指针数组的指针?您尚未显示该代码的主体。我不知道在C中设置*arg
是否有效,但在C++中肯定无效。关于c++ - 如何调用具有参数的函数,该参数是指向结构的指针数组的指针并且未指定大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34687562/