【问题标题】:C struct/function cross referenceC 结构/函数交叉引用
【发布时间】:2012-06-15 04:29:17
【问题描述】:

所以我更有可能在 C 中遇到交叉引用问题

你好,(由于某种原因我不能先写出来)

基本上是这段代码:

structA.h:

#pragma once

#include "structB.h"

typedef struct
{
    B b;
}A;

结构B.h:

#pragma once

#include "structA.h"

typedef struct
{
    int field;
}B;

void func(A* a);

structB.c:

#include "structB.h"

void func(A* a)
{
}

在VC2010上产生以下错误:

structa.h(7):错误 C2016:C 要求结构或联合具有 at

至少一个成员 structa.h(7):错误 C2061:语法错误:标识符

'B'等

所以因为我在 func(A* a) 中只有一个指向 A 的指针,所以我尝试像这样进行前向声明:

#pragma once

typedef struct A;

typedef struct
{
    int field;
}B;

void func(A* a);

我在 structB.c 中添加#include "structA.h"

但这不起作用,要修复它我必须在原型和实现中将 func(A* a) 的参数更改为 func(struct A* a)...

但在这种情况下,我失去了对我的结构进行类型定义的目的......

我知道我可以简单地将函数移动到另一个文件,但该函数与我的结构相关,所以我想将原型保存在与我的结构相同的文件中。 现在也许这不是用 C 做事的好方法,我主要习惯于 C++,所以我倾向于在做 C 时用 C++ 思考,这通常是有问题的......

有人知道解决方法吗?非常感谢。

【问题讨论】:

  • 有什么问题? func 采用指向 A 的指针。它可以在structA.h。为什么要强制它进入structB.h?从您发布的内容来看,structA.h 似乎更有意义。也许如果您使用实际名称而不是诸如structAstructB 之类的虚构名称,那么您要做什么会更明显?
  • 基本上在我的例子中,B 代表一个玩家,func 用于 updatePlayer(),它需要一个 Game (A) 指针,该指针包含一些用于更新玩家的有用信息,并持有 Game 结构一个玩家。

标签: c function reference struct param


【解决方案1】:
typedef struct structA;

这甚至是如何编译的? -- 正确:

typedef struct A A;

【讨论】:

  • 我的错,这是一个复制/粘贴问题,应该是 typedef struct A;但是您的更正也不起作用:重新定义;不同的基本类型见'A'的声明
  • 您确定您不是在尝试使用 C++ 编译器编译 C 代码吗?
  • 好的,经过进一步研究,我发现如果我将我的结构声明为这个 typedef struct { }MyStruct; 它将无法工作。我需要声明为: typedef struct MyStruct MyStruct;结构 MyStruct { };所以你的修正会起作用,H2CO3。我不知道第一次使用 struct 会导致这种问题,我想第二个更干净。因为我还不能回答我的问题,所以我会把你的问题标记为好。抱歉,我不能将代码块放入 cmets :((,也许你可以为我写它作为答案。无论如何,谢谢。
  • 感谢您的接受。您可以通过将代码块括在反引号中来将代码块放入 cmets:int i = 0;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多