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”的成员 [重复]