gpt4 book ai didi

c - 关于 (#include)ing 非标准库的几个疑问

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

假设我在一个文件中编写了一些函数,我们称之为 foo.c。这是foo.c:

int d;

typedef int bar;

int foo(int a, int b){
...
}

void boo(){
...
}

char *test(){
...
}

现在,boo 是一个仅在 foo.c 中使用的函数,而 foo()test()dBool 将需要能够在其他文件中被调用。

为了做到这一点,我知道我必须创建一个 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.c 函数和类型的文件中包含 foo.hfoo.c

所以 foo.c 最后看起来像这样:

#include "foo.h"

int d;

typedef int bar;

int foo(int a, int b){
...
}

void boo(){
...
}

char *test(){
...
}

这是我的问题。

Q1。你真的是这样做的吗?由于 foo.h 已包含在 foo.c 中,因此在其中包含的文件中仅包含 foo.c 是否足够?我想使用它的功能?我不能直接在 foo.c 文件中定义函数,根本不使用 foo.h 文件吗?

Q2。您真的必须将 extern 放在 foo.h 文件中的 typedef 前面吗?

Q3。假设在 foo.c 中我使用了一些标准 C 库,例如 string.h 和 math.h。我应该在哪里包括它们?直接在 foo.c 文件中,在 foo.h 文件中还是在两者中? #ifndef 指令是否必要?如果是这样,您如何正确使用它们?

Q4。编写完 foo.cfoo.h 文件后,我准备好了吗?就像,我不需要编译它们或任何东西,对吧?我可以像那样在任何需要的地方#include 吗?

问题 5。我在其他地方读到,如果我想使用自定义库,这些是我需要遵循的步骤:

  • 定义接口(interface)(foo.h)
  • 编写foo.c #include foo.h
  • 像这样创建目标文件 gcc -o foo.o -c foo.c
  • 在我想使用foo.c函数的程序中包含foo.h
  • 像这样链接目标文件 gcc my_proj.c foo.o

这些步骤真的有必要吗?因为我没有在其他任何地方看到它们被提及。为什么我只需要在要使用 foo.c 函数的文件中包含 foo.h?目标文件到底是什么?

感谢您的宝贵时间,如果这有点冗长,我们深表歉意

最佳答案

Q1. Is this how you actually do it? Since foo.h is already included in foo.c, wouldn't it be sufficient to include only foo.c in the file in which I want to use its functions?

您只是不包含 .c 文件。在您的情况下,foo.c 和其他文件是独立的编译单元,它们最终链接在一起。

Q2. Do you actually have to put the external in front of typedefs in the foo.h file?

不,typedef 不需要 extern

Q3. Let's say that in foo.c I use some standard C libraries like string.h and math.h . Where should I include them? Directly in the foo.c file, in the foo.h file or in both? Are #ifndef instructions necessary? If so, how do you use them correctly?

如果您在 .h 中也需要这些文件,请将它们包含在那里(例如,用于函数原型(prototype)中使用的类型)。如果您只在 .c 中需要它们,请将它们包含在那里。

Q4. After writing the foo.c and foo.h file, am I all ready to go? Like, I don't need to compile them or anything, right? I can just #include them wherever I need just like that?

您可以编译它们以获得可调用的东西。如果你不编译你的程序,你就不能使用它。还是我理解错了?

Q5. Somewhere else I've read that if I want to use a custom library these are the steps that I need to follow:

[snip]

确实,这是一种方法。出于显而易见的原因,不能省略步骤 1、2 和 4。但是你可以通过做一起执行第 3 步和第 5 步

gcc my_proj.c foo.c

这会编译给定的文件,然后在一次调用中将它们链接在一起。

Why do I only need to include foo.h in the file in which I want to use foo.c functions?

这是因为生成的目标文件包含有关链接器需要从其他目标文件获取哪些函数的信息。

What exactly is an object file?

它是编译一个源文件的结果。如果您将多个目标文件链接在一起,您将获得一个正在运行的可执行文件。

换句话说:目标文件是源文件的编译版本。它“提供”其他目标文件所需的标识符,它“需要”其他文件提供的其他标识符。将它们链接在一起意味着需要的对象和提供的对象以适当的方式连接起来,以便程序可以运行。

示例:您有一个 foo.c,它定义了函数 footest。然后你有一个 main.c,它利用这些函数并提供函数 main。最后,它们被链接在一起并与启动程序所需的启动代码组合在一起,该启动代码调用 main()main() 中分别调用foo()test() 的点都用特殊的方式标记出来,这样链接器就可以把那里的实际调用地址。

关于c - 关于 (#include)ing 非标准库的几个疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293424/

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