- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图弄清楚如何将 C 头文件与 #ifndef 和 #include 一起使用。假设我有这两个头文件:
headerA.h:
#ifndef HEADERA_H
#define HEADERA_H
#include "headerB.h"
typedef int MyInt;
TFoo foo;
... some other structures from headerB.h ...
#endif
headerB.h
#ifndef HEADERB_H
#define HEADERB_H
#include "headerA.h"
typedef struct foo{
MyInt x;
} TFoo;
#endif
headerA.c
#include "headerA.h"
... some code ...
headerB.c
#include "headerB.h"
... some code ...
编译 headerB.c 时,它说
In file included from headerB.h,
from headerB.c:
headerA.h: error: unknown type name ‘MyInt’
我认为,这是因为当headerB.h编译时,它定义了HEADERB_H,然后,当headerA.h想要包含< strong>headerB.h,#ifndef HEADERA_H
为 false = 跳过包含。
这里的最佳实践是什么?我刚刚读到,最佳实践是在头文件中执行所有 #include
指令,但在这种情况下,它看起来像是一个问题。
编辑:好的,很抱歉误导您。这只是具有更多文件的较大项目的示例。
最佳答案
您有一个循环依赖。头文件 headerA.h
依赖于 headerB.h
,而 headerB.h
又依赖于 headerA.h
等等。
您需要打破这种依赖性,例如不在headerA.h
中包含headerB.h
。不需要它(headerA.h
中的任何内容都不需要 headerB.h
中的任何内容)。
如果您必须包含 headerB.h
(如您最近的编辑中所述),那么您首先应该重新考虑如何使用头文件,以及在何处放置什么定义。也许将 MyInt
的定义移至 headerB.h
?或者有更多的头文件,例如一个用于类型别名的头文件(例如我个人认为没有用的 MyInt
),一个用于结构体,一个用于变量声明?
如果这是不可能的,那么您可以尝试更改定义和包含的顺序,例如
#ifndef HEADERA_H
#define HEADERA_H
// Define type alias first, and other things needed by headerB.h
typedef int MyInt;
// Then include the header file needing the above definitions
#include "headerB.h"
TFoo foo;
... some other structures from headerB.h ...
#endif
关于C头文件#ifndef#include错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40629479/
这个问题在这里已经有了答案: Boolean in ifdef: is "#ifdef A && B" the same as "#if defined(A) && defined(B)"? (5
考虑代码。 #ifndef FOO_H #define FOO_H //Code #endif 代码可以是以下情况 // Case 1: #define foo 0 // Case 2: void f
我试图弄清楚如何将 C 头文件与 #ifndef 和 #include 一起使用。假设我有这两个头文件: headerA.h: #ifndef HEADERA_H #define HEADERA_H
假设我有a.h其中包括以下内容: 假设我还有b.h其中还包括 。如果a.h有#ifndef其中的预处理器定义语句和 b.h没有。会a.h仅包含 b.h 中未包含的内容?那么当 b.h包括a.h
我只是在定义常量时考虑以下方法之间的区别: 方法1:使用 include Guard 创建一个头文件来定义所有常量: #ifndef c1 #define c1 @"a123456789" #endi
所以我试图将我在 main.cpp 中声明的库包含到我的 header.h 中 //In my main.cpp #include #include #include using namespa
这个问题在这里已经有了答案: Header guard / translation unit problem (2 个答案) 关闭 9 年前。 有个问题让我百思不得其解。我知道这样做是不对的,但我不
类声明通常是这样的: #ifndef MY_CLASS_20141116 #define MY_CLASS_20141116 ... class MyClass { ... } #endif
我在 ifndef 中有一个结构,它在 visual studio 中是灰色的。它位于一个头文件中,然后包含在另一个 cpp 文件中。 cpp文件无法访问struct,导致编译错误。 我已经在 vis
Include guards在头文件中通常用于保护代码部分免受双重包含: #ifndef FOOBAR_H #define FOOBAR_H extern void myfoofunc(void);
我正在学习 C,希望有人能解释一下使用 #ifndef 的逻辑是什么? 我还发现我看过很多 C 程序,人们似乎遵循使用 #ifndef、#define 和 #endif 之后的文件名的约定>。取这个名
我正在尝试使用 #ifndef,如下所示。 #ifndef MACRO1 || #ifndef MACRO2 .... #endif 我已经试过了: #ifndef (MACRO1 || MACRO2
如果每个 header 都使用 #ifndef,这是否意味着关于循环依赖的编译器错误不会发生? 最佳答案 不,它没有。 这意味着编译器不会尝试包含无穷大的 header ,但是循环依赖仍然会带来逻辑问
为 PAL.h 中的函数指针获取“已在 GUI.obj 中定义”的 LNK2005 //GUI.cpp #include "PAL.h" //PAL.h #define PAL_INCLUDE int
请相信我:我搜索和测试了很多...但我没有弄错这里: VERSION := 123 all: ifndef VERSION $(error VERSION not set)
这个问题可能很奇怪,我目前正在研究一些旧代码(不是我写的)。我实际上不是 C 程序员,但我想了解这部分代码实际上应该做什么。幸运的是,奇怪的部分并不太长(配置的一部分): int main () {
我有一个使用Boost库的Qt / C++项目,并且看到Boost header 包含如下内容: #ifndef Q_MOC_RUN #include #include #endif 我读到,如果
我的 program.wxs 文件中有以下片段: ... ... 我正在使用以下
这个问题可能很奇怪,我目前正在研究一些旧代码(不是我写的)。我实际上不是 C 程序员,但我想了解这部分代码实际上应该做什么。幸运的是,奇怪的部分并不太长(配置的一部分): int main () {
这个问题在这里已经有了答案: Why aren't my include guards preventing recursive inclusion and multiple symbol defi
我是一名优秀的程序员,十分优秀!