我遇到了链接.h和.c文件的问题,我已经阅读了一些关于这个问题的帖子,但所有这些帖子都有点模糊,我还无法完全掌握它的概念,而且我遇到了很多链接问题。 假设我有b.c和b.h,我将在a.c中使用它们,我困惑是否应该在a.c和b.c中都包含b.h,因为b.c本身需要了解b.h中定义的结构,我有一些函数在b.h中具有原型,并在b.c中定义,这些函数还使用b.h中的结构,我没有在b.c中包含b.h,因为据我所知,b.h更像是接口,用于a.c使用b.c中的函数...这里有一个更清晰的例子
b.h文件
typedef struct{
int x, y;
}myStruct;
void funct1(myStruct);
void funct2(myStruct);
b.c 文件
void funct1(myStruct x)
{
//do something
}
void funct2(myStruct y)
{
//do something
}
a.c文件
#include "b.h"
int main()
{
myStruct x;
funct1(x);
funct2(y);
return 0;
}
在cygwin中执行了命令:gcc b.c a.c -g
现在令人困惑的是,当编译b.c时,存在链接错误,它无法检测到b.h中的结构和原型。因为我所知道的就是b.h用于从a.c链接b.c,但当两个.c文件都被编译时,似乎b.c找不到其结构和原型。
为什么我没有在b.c中包含b.h? 答案:因为据我所知,b.h已经包含在a.c中了,如果我在b.c中再次包含它,我将重复包含 <---这是我目前所学到的,我知道有#ifdef,但似乎它不起作用,也许我还不知道如何使用它,如果您知道,请随意讨论。
如果您有任何想法,请告诉我一些。
注意:假设上述所有代码都符合语法规则,如果有任何拼写错误,请忽略,我只关注.h和.c之间的包含。
#ifndef
表示 如果未定义,无论何时您包含 .h 文件,它都会定义该符号,因此如果您再次包含相同的 .h 文件,则该符号已经被定义。 - BenjiWiebeSOME_HEADER_FILE
仅在 b.c 中定义。随后,在 b.c 中使用#ifdef
和#ifndef
语句可以检测到它是否在 b.c 中。 - Remy Lebeau