繁体   English   中英

在 header 中使用结构和 typedef 可能不好

[英]Probably bad using structures and typedef in header

您好,如何重写可能不好的结构?
我试图询问如何修复它以使其在那里工作,但也许这都是糟糕的构想。 还有其他解决方案吗? 它在 Eclipse 中使用 GCC 编译为 linux,编译为 C 代码。

文件first.h

#ifndef FIRST_H_
#define FIRST_H_

typedef struct foo
{
    int a;
    char *c;
} foo_struct;

#endif /* FIRST_H_ */

文件 second.h:

#ifndef SECOND_H_
#define SECOND_H_

#include "first.h"

typedef struct wtf
        {
        foo_struct *poleFOO[5];
        }wtf_struct;

#endif /* SECOND_H_ */

具体在文件 second.h 行 foo_struct *poleFOO[5]; 抛出:“foo_struct 无法解析”我在 Linux Ubuntu 11.10 上工作,在编辑器 Eclipse 中使用 gcc 为 C 和 C++。

好的,这不是来自编译器的错误,而是来自Eclipse的错误。 只是Googling错误“无法解决”就使我指向了有关Eclipse CDT(用于C / C ++开发的eclipse子系统)的文章。

因此,它与Eclipse有关,您的C标头在语法上看起来正确。 我相信,没有C文件,只有标头,Eclipse不知道如何仅分析标头以创建自己的索引数据库(必须用于智能感知,符号列表等)。

我建议您插入一个包含second.h的简单C文件,并使用main()函数,以便链接步骤也可以通过,例如:

#include "second.h"

int main() {
    wtf_struct my_variable;
    return 0;
}

我遇到了相同的错误:typedef中的包装类型出现“ vuint16-无法解析”(如下所述),并且通过在Eclipse环境中重建索引成功解决了该问题(右键单击项目->索引->重建)注意:这不是编译器错误!

[headerfile1: can.h]
#define vuint8 uint8

[headerfile2: can_local.h]
#include "Can.h" /* include all needed types */
typedef struct sCanRxFullInfoStruct
{
  vuint16 objectNumber; //error line
} tCanRxFullInfoStruct;

创建一组包装其他类型的typedef后,我遇到了同样的问题。 解决方案是重建Eclipse Index-右键单击项目-> Index->​​ Rebuild

我来到这里是因为我遇到了类似的问题,而 Eclipse 也是罪魁祸首(我仅使用 GCC 进行了复制并且它有效)。 我试图重现 OP 的问题,但它在我的环境中编译正常:/。 因此,我将展示对我有用的方法。

唯一有帮助的是使用struct进行extern声明,并使用我用typedef定义的新类型在源文件中进行实际定义,如下所示:

lib1.h:

typedef struct sMyStruct
{
    // struct fill
}tMyStruct;

lib2.h:

extern struct sMyStruct my_struct, *p_my_struct;
//extern tMyStruct my_struct, *p_my_struct; // This wouldn't work

lib2.c:

tMyStruct my_struct, *p_my_struct;

在 lib2.h 中使用extern tMyStruct无论如何,它都不会编译(无法识别typedef )。 清理项目无济于事,重建索引等也无济于事。令人惊讶的是,我试图在一个新项目中以最少的方式重现该问题......并且它编译得很好,对于两个版本,所以。 我不知道,Eclipse 被一些邪恶的幽灵文件挂断了。 我被困了好几天,唯一对实际项目有用的是我上面展示的。

我怀疑您已经创建(包括)了两个标头保护都相同的标头

#ifndef FIRST_H_
#define FIRST_H_

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM