【问题标题】:C2371: 'mxArray' : redefinition; different basic typesC2371:“mxArray”:重新定义;不同的基本类型
【发布时间】:2013-01-04 00:00:23
【问题描述】:

我正在尝试使用 VS 2010 MATLAB 2012b 混合一段代码并收到此错误

c:\users\krzysztof\desktop\libocas_v096\libocas_v096\sparse_mat.h(27):错误 C2371:'mxArray':重新定义;不同的基本类型 c:\program files\matlab\r2012b\extern\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 */

【问题讨论】:

  • 结构的重新定义是不合法的 C. 如果 GCC 接受了代码,那对你来说非常好。你能显示两个结构定义吗?
  • 它抱怨第 293 行。matrix.h 的下面部分带有此行 ` #ifndef MATHWORKS_MATRIX_MXARRAY_PUB_FWD_H #define MATHWORKS_MATRIX_MXARRAY_PUB_FWD_H /* 版权所有 2008 The MathWorks, Inc. / /* *发布了 mxArray /typedef struct mxArray_tag mxArray 的不完整定义; MATHWORKS_MATRIX_MXARRAY_PUB_FWD_H */`
  • 而你为什么要重新定义它?
  • 我不是作者,只是发送给作者发送相同问题的电子邮件。也许重命名就足够了
  • 您可以尝试从 mxArray 重命名您的结构吗?它已经定义好了。这应该可以解决您的问题。

标签: c matlab compiler-construction


【解决方案1】:

尝试包含标题"mex.h" 而不是"matrix.h"

【讨论】:

    【解决方案2】:

    您似乎没有正确使用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;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2015-01-11
      相关资源
      最近更新 更多