gpt4 book ai didi

c - 如何声明一个不会产生警告的结构?

转载 作者:太空宇宙 更新时间:2023-11-04 06:40:18 25 4
gpt4 key购买 nike

这个问题看起来很经典,但是我没有找到答案:

我有两个用 C 写的结构类型 ------ 结构类型 A 和结构类型 B,B 使用 A 而 A 同时使用 B。

在 a.h 中:

#include "b.h"
struct B;
typedef struct A {
void (*func)(struct B* b);
}A;

在 b.h 中:

#include "a.h"
typedef struct B {
A a;
}B;

虽然这可行,但它有一个后果 --- 在使用函数 fun "func"时,如果我传递一个以以下形式声明的变量:

B* someb;

不是:

struct B* someb;

编译的时候会有警告,说不兼容的指针类型。这是正常的吗?我可以避免这个警告吗?

最佳答案

从您的a.h 头文件中,只需删除行#include "b.h"。前向声明 struct B; 就是您所需要的。

该更改将修复循环包含依赖性,并将使使用这些 header 的任何代码更加理智。

然后,无论您想在何处使用 B 结构,只需包含 b.h,并在有或没有 struct 关键字的情况下使用它.

一些代码来说明:a.h 头文件:

/* a.h */
struct B;

typedef struct A {
void (*func)(struct B* b);
} A;

b.h 头文件:

/* b.h */
#include "a.h"

typedef struct B {
A a;
} B;

使用这些头文件的文件:

/* some_file.c */
#include "b.h"

void fun() {
B someb;
someb.a.func(&someb);
}

void fun2() {
struct B someb;
someb.a.func(&someb);
}

funfun2 都很好(从编译器的角度来看 - func 还没有初始化,所以调用它会在运行时导致问题)。

关于c - 如何声明一个不会产生警告的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9442915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com