【发布时间】:2019-05-24 21:50:05
【问题描述】:
假设我在一个文件中编写了一些函数,我们将其称为foo.c。
这是foo.c:
int d;
typedef int bar;
int foo(int a, int b){
...
}
void boo(){
...
}
char *test(){
...
}
现在,boo 是仅在 foo.c 中使用的函数,而 foo()、test()、d 和 Bool 需要能够在其他文件中被调用。
为了做到这一点,我知道我必须创建一个foo.h 文件并这样写:
extern int d;
extern typedef int bar;
int foo(int a, int b);
char *test();
然后#include "foo.h" 在foo.c 文件中,并且每当我想使用foo.c 中定义的类型和函数时,我必须在我想使用的文件中包含foo.h 和foo.c foo.c 函数和类型。
所以foo.c 最终会是这样的:
#include "foo.h"
int d;
typedef int bar;
int foo(int a, int b){
...
}
void boo(){
...
}
char *test(){
...
}
这是我的问题。
第一季度。这是你实际做的吗?既然foo.h 已经包含在foo.c 中,那么在我想使用其功能的文件中仅包含foo.c 是否就足够了?我不能直接在 foo.c 文件中定义函数,根本不使用 foo.h 文件吗?
第二季度。你真的必须将extern 放在foo.h 文件中的typedef 前面吗?
第三季度。假设在 foo.c 中,我使用了一些标准 C 库,例如 string.h 和 math.h 。我应该在哪里包括它们?直接在foo.c 文件中,在foo.h 文件中还是在两者中?是否需要 #ifndef 指令?如果有,你如何正确使用它们?
第四季度。写完foo.c 和foo.h 文件后,我准备好了吗?就像,我不需要编译它们或任何东西,对吧?我可以在任何需要的地方#include他们吗?
Q5。我在其他地方读到,如果我想使用自定义库,这些是我需要遵循的步骤:
- 定义接口 (
foo.h) - 写
foo.c#include ingfoo.h - 创建这样的目标文件
gcc -o foo.o -c foo.c - 在我想使用
foo.c函数的程序中包含foo.h - 像这样链接目标文件
gcc my_proj.c foo.o
这些步骤真的有必要吗?因为我没有在其他地方看到他们提到过。为什么我只需要在要使用foo.c 函数的文件中包含foo.h?目标文件到底是什么?
感谢您的宝贵时间,如果有点冗长,请见谅
【问题讨论】:
-
wouldn't it be sufficient to include only foo.c- 从不包含 C 文件(即具有实际代码的文件),仅包含 H 文件(即具有函数声明和/或预处理器定义的文件)。 -
typedefBool不是一个好主意int -
“我不需要编译它们什么的,对吗?” 对,只要你的唯一目的是编写 C 源代码,并且从不执行它。还是我理解错了?
-
你应该阅读一点关于编译和链接的区别。 ...和翻译单元。
-
@FoxyIT 好吧,这是人们能想到的最糟糕的例子之一。请称它为
typedef int bar;或 bool 以外的任何名称
标签: c