我尝试使用 VS 2010 MATLAB 2012b MEX 一段代码并收到此错误
c:\users\krzysztof\desktop\libocas_v096\libocas_v096\sparse_mat.h(27):错误 C2371:'mxArray':重新定义;不同的基本类型 c:\程序文件\matlab 2012b xtern\include\matrix.h(293) :参见“mxArray”的声明
代码包含#include,其中包括matrix.h
另一段代码包括sparse_mat.h,它重新定义了matrix.h类型,例如
typedef struct {
INDEX_TYPE_T *ir;
INDEX_TYPE_T *jc;
INDEX_TYPE_T m;
INDEX_TYPE_T n;
double *pr;
NNZ_TYPE_T nzmax;
int sparse;
} mxArray;
知道如何消除这个错误吗? GCC 编译此代码。
克日什托夫
它抱怨第 293 行。matrix.h 的下面部分包含此行
#ifndef MATHWORKS_MATRIX_MXARRAY_PUB_FWD_H
#define MATHWORKS_MATRIX_MXARRAY_PUB_FWD_H
/* Copyright 2008 The MathWorks, Inc. */
/**
* Published incomplete definition of mxArray
*/
typedef struct mxArray_tag mxArray; <--- line 293
#endif /* MATHWORKS_MATRIX_MXARRAY_PUB_FWD_H */
尝试包含标题
"mex.h"
而不是 "matrix.h"
。
看来您没有正确使用
forward declaration
。
在
typedef struct {
INDEX_TYPE_T *ir;
INDEX_TYPE_T *jc;
INDEX_TYPE_T m;
INDEX_TYPE_T n;
double *pr;
NNZ_TYPE_T nzmax;
int sparse;
} mxArray;
您正在定义一个名为
mxArray
的新类型。
在
typedef struct mxArray_tag mxArray;
您将类型
struct mxArray_tag
别名为 mxArray
,它与您已经定义的 mxArray
发生冲突。
根据代码中的注释,您尝试通过前向声明来声明
mxArray
类型。对您的代码执行此操作的正确方法是 typedef mxArray mxArray_tag;
。或者,更自然的是,您可以更改 mxArray
的完整类型定义,使其不成为匿名结构:
typedef struct _mxArray {
INDEX_TYPE_T *ir;
INDEX_TYPE_T *jc;
INDEX_TYPE_T m;
INDEX_TYPE_T n;
double *pr;
NNZ_TYPE_T nzmax;
int sparse;
} mxArray;
并且前向声明将是
typedef struct _mxArray mxArray;
。