【问题标题】: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 中编译。谢谢!

标签: c gcc struct unions


【解决方案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 的更大应用程序中编译。但我的问题仍然是为什么代码有时会编译,而在其他情况下却不行。所以这个答案并没有具体回答这个问题。这与鼓励新人有什么关系?我发表评论以表明我对他的回答的看法,如果他认为这有帮助并改进了他的回答,我很乐意支持他的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多