gpt4 book ai didi

c - 在 C 中包含守卫

转载 作者:太空宇宙 更新时间:2023-11-04 00:23:21 24 4
gpt4 key购买 nike

我有 2 个头文件,它们必须相互包含。

配置.h:

#ifndef CONFIG
#define CONFIG

#include "debug.h"

typedef struct Config_t {
/* some stuff */
} Config;
#endif

调试.h

#ifndef DEBUG
#define DEBUG

#include "config.h"

void somePrintingFunction(Config* conf);
#endif

这是我得到的错误:

debug.h: error: unknown type name 'Config'

config.c: warning: implicit declaration of function 'somePrintingFunction'

debug.h: error: unknown type name 'Config'

我猜它在标题声明中循环?


编辑:

修复了合并两个文件的问题,从而简化了项目设计。如果你想要一个真正的修复检查评论。

最佳答案

config.h包含debug.h时,debug.h会尝试包含config.h但由于 CONFIG 守卫宏已经被定义,config.h 的追溯“include”将被跳过,解析将在下一行继续:

void somePrintingFunction(Config* conf);

没有定义 Config 类型。

作为StoryTeller已指出,您可以通过向前声明 Config_t 结构来打破相互依赖:

struct Config_t;
void somePrintingFunction(struct Config_t* conf);

从 C11 开始,您还可以执行 typedef,因为 C11 可以处理重复的 typedef,只要它们引用相同的类型即可。

typedef struct Config_t Config;
void somePrintingFunction(Config* conf);

(聚合(结构或 union )的前向声明不允许您声明这些类型的对象(除非已经提供了完整的定义)但是由于 C 保证所有指向结构或 union 的指针必须看起来相同,它们足以让您开始使用指向这些类型的指针。)

关于c - 在 C 中包含守卫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53432014/

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