- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我在一个文件中编写了一些函数,我们称之为 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.c 函数和类型的文件中包含 foo.h
和 foo.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.c
和 foo.h
文件后,我准备好了吗?就像,我不需要编译它们或任何东西,对吧?我可以像那样在任何需要的地方#include
吗?
问题 5。我在其他地方读到,如果我想使用自定义库,这些是我需要遵循的步骤:
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,它定义了函数 foo
和 test
。然后你有一个 main.c,它利用这些函数并提供函数 main
。最后,它们被链接在一起并与启动程序所需的启动代码组合在一起,该启动代码调用 main()
。 main()
中分别调用foo()
和test()
的点都用特殊的方式标记出来,这样链接器就可以把那里的实际调用地址。
关于c - 关于 (#include)ing 非标准库的几个疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293424/
就在几周前,Google 更改了 Android LVL API(许可证验证库)。 在旧 LVL 中,许可证检查基于使用基于每个帐户生成的公钥/私钥进行的许可证验证。新的假设是对每个应用程序库使用公钥
我在代码中创建了下面的两个类,我不确定我是否以正确的 oop 方式创建了它。我将几何类和顶点设置为两个不同的类,或者它们可以是一个父亲和一个 child ,这很好吗?另一个问题是当我调用几何显示方法时
我正在尝试使用 POST 将变量从 try.htm 传递到 chat.php try.htm 的代码是: function yo() { var text = $("#m
我从未使用过代码源控制系统,我从 GitHub 开始,它看起来很棒! 我阅读了指南,我想我可以很好地理解它是如何工作的,而且我已经在使用它了,但我不清楚一些事情:GitHub 是否会自动将原始存储库中
我有这个函数insert() 该函数在表users中插入数据并发送电子邮件。 我需要在创建另一个状态之前终止前一个状态,对吗?因此,我需要将激活链接存储在另一个表中,即 activationLinks
目前正在为差异模块使用带有差异模式的 postgres。现在我计划切换到 oracle。但我听说在 oracle 模式中不存在..是真的吗..如果是这样我该如何迁移? 最佳答案 在 Oracle 中,
我有以下父对象: Context = { ContextModel: Backbone.Model.extend({ //model Code }), ContextLi
在 C++ 中,我了解到变量用于数据存储,对象是类的实例。但在 JavaScript 中,我看到人们将变量称为对象。为什么变量在 JavaScript 中被称为对象。我对此感到困惑。 最佳答案 在 j
我正在浏览有关 Play 的帖子! framework 并遇到了一些讨论 ecommerce 的帖子。由于我是两者的初学者,我想做一个练习。我写下了一些用例和一些要求如下。我会想听听您对此的看法,希望
人们说 asList方法将数组转换为列表并且不复制,因此“aList”中的每个更改都会反射(reflect)到“a”中。因此,在“aList”中添加新值是非法的,因为数组的大小是固定的。 但是,asL
我决定使用 React-Router 来管理使用 REACT JS 的 Meteor JS 应用程序的路由。 我已经让 React-Router “以某种方式”工作,但它有一些负面影响,我想在这里解释
Class Carro { String name String marca String matricula } Class CarroMovel{ String pro1 String prop2
我对如何设置我的 SVN 东西有一些疑问。 首先是我的情况:程序员独自处理大部分内容,不需要外部访问(目前)。 我要: 一个快速的 SVN,最好是免费的。 私有(private) 备份友好 比较轻松
我正在用 MVVM 做我的第一个 C# WPF 项目,我有几个问题。 第一,我想从我的模型中列出一些对象,当我点击其中一个时,屏幕上会显示一个表单(或默认情况下创建的表单)。在我的表单中,绑定(bin
我对mysql有疑问。我可以轻松地将字段限制为某些字符,例如姓氏,以及其他字段,例如包含特定事件的迷你日志,我认为该事件不再是 2 页(或更少的字符)。我知道这是一个相当常见的问题,我看到了很多关于这
我正在尝试实现 HDLC 帧格式类型 3,但我对帧的 Octets/Modulo 8 编码有一些疑问。 首先,HDLC帧是否全部以Octets传输? 一个帧的长度是 'n' 个八位字节是什么意思?请举
我正在开发一个 ASP.Net 电子商务应用程序。我使用 ASP.Net Web 表单。当我完成整个应用程序时,我考虑缓存一些数据,以便提高应用程序性能。 (坏主意......我必须从一开始就考虑到这
我知道下面的代码会产生编译错误: class A{ public : virtual void name(){cout(b); //Error : 'A' is an inaccessible bas
我是一名优秀的程序员,十分优秀!