GCC不一致的编译错误'没有名为'的成员[重复]

Posted

技术标签:

【中文标题】GCC不一致的编译错误\'没有名为\'的成员[重复]【英文标题】:GCC Inconsistent compilation error 'has no member named ' [duplicate]GCC不一致的编译错误'没有名为'的成员[重复] 【发布时间】:2014-04-02 08:37:26 【问题描述】:

在 C 应用程序中,存在以下代码。

#include <stdlib.h>
#include <string.h>

typedef struct

  /*! matrix ID */
  int id;
  /*! number of rows */
  int num_rows;
  /*! number of columns */
  int num_cols;

  union 
    float  *matrix;
    float  *vector;
  ;
 PpetKeviParams;

typedef struct 
  char DB_char;
  int DB_index;
  float DB_val;
  PpetKeviParams outvec;
 DBType;

int main(void)

  DBType *p_DB=(DBType *)malloc( sizeof(DBType));

  if (p_DB->outvec.vector == NULL) 
    printf("\t\t\tp_DB->outvec.vector is NULL\n");
  

  if(p_DB != NULL) 
    free(p_DB);
  

  return 0;

上面的代码正在编译和执行,作为一个独立的应用程序。

但是,当结构 DBType 用作更大应用程序的一部分时,以下行给出错误,

if (p_DB->outvec.vector == NULL) 

错误:“PpetKeviParams”没有名为“vector”的成员**

Linux机器中的gcc版本是4.1.1

相同的代码(更大的应用程序)正在 gcc 4.6.2 机器中编译。

我找不到问题。有人可以帮忙吗?

【问题讨论】:

这已在另一个 Stack Overflow 问题中得到解决。结帐Anonymous union within struct not in c99? 检查:在每种情况下,是否启用了 GNU 扩展?换句话说,你编译每个程序的标准是什么? @Yu Hao,较大的应用程序,编译错误是用'-std=c99 -ansi'编译的。 @Yu Hao,@R Sahu,从 Makefile 中禁用“-std=c99 -ansi”后,代码将在 GCC 4.1.1 中编译。谢谢! 【参考方案1】:

上述问题是由于 GCC 4.1.1 中的“std=c89 / c99”源代码中的“未命名联合”问题造成的。禁用“std=c89”后,代码将在 GCC 4.1.1 中编译。

【讨论】:

【参考方案2】:

试着给你的工会起个名字。

union 
    float *matrix;
    float *vector;
 someName;

然后像这样访问向量:

p_DB->outvec.someName.vector

【讨论】:

没错,但这不是问题所在。 @YuHao 问题是“有人可以帮忙吗?”,这就是我们需要的帮助。 @JimBalter 在我看来,问题是为什么这段代码在 GCC 4.6.1 中编译而不是在 GCC 4.1.1 中编译,就像标题中的内容一样。 你有权发表你的意见,但这是错误的——OP 说它在 4.1.1 中编译,但在 4.6.2 中编译。无论如何,答案确实解决了 OP 的问题,但它可能会好很多。但我们应该鼓励新人回答问题。 @JimBalter 我又读了一遍,我误读了这个问题,因为它也不能在 4.1.1 的更大应用程序中编译。但我的问题仍然是为什么代码有时会编译,而在其他情况下却不行。所以这个答案并没有具体回答这个问题。这与鼓励新人有什么关系?我发表评论以表明我对他的回答的看法,如果他认为这有帮助并改进了他的回答,我很乐意支持他的回答。

以上是关于GCC不一致的编译错误'没有名为'的成员[重复]的主要内容,如果未能解决你的问题,请参考以下文章

gcc 编译错误:模板类表中嵌套类 A ​​的成员在嵌套朋友类中不可见。为啥?

npm未安装node-gyp,错误:“类v8 :: Object”没有名为“ ForceSet”的成员

类 std::vector<...> 没有名为 [重复] 的成员

Swift 类“MyClass”没有名为“My_Var”的成员 [重复]

Ada - 奇怪的错误 - gcc/gnatbind 的一致版本

我的 linux 的 gcc 编译器不支持布尔值 [重复]