这是一个来自求职面试的问题。让我们说我们有一些带有一些功能的“ac”源文件和“啊”作为它的头文件。我们也有调用该函数的main.c文件。现在假设我们有“啊“和”ao“(目标文件)和ac不可用。我们现在如何调用此函数? (我有一个提示,我们需要使用函数指针。另一个提示是使用预编译器指令,如#define和#ifndef)。 另外我想知道.h文件中我们是否知道我们是否正确链接到源文件? 谢谢
答案 0 :(得分:2)
只需在main.c中包含a.h,就可以使用a.h中声明的函数。然后使用与a.o is build:
相同的编译器版本编译它gcc -c main.c
gcc main.o a.o
答案 1 :(得分:2)
要编译main.c,需要函数定义。你已经在a.h.所以你会写:
// main.c
#include "a.h"
int main()
{
foobar(); // Let's say this is the function from a.h
}
编译时,您必须在链接阶段包含目标文件。所以使用gcc ......
gcc -c main.c // Compile main.c to main.o
gcc -o main main.o a.o
不需要函数指针或宏。
答案 2 :(得分:2)
您描述它的方式,您只需要一个头文件来调用该函数。头文件包含函数的原型,它允许编译器知道函数的签名是什么。
然后,您将链接到您的目标文件(其中包含已编译的函数版本),一切都会正常。
我不知道你为什么需要函数指针或预编译器指令。也许你不理解100%的问题?
答案 3 :(得分:0)
在main.c中,正常调用该函数。
然后将main.c编译为main.o. gcc -c main.c
然后链接a.o和main.o. gcc main.o a.o
答案 4 :(得分:0)
关于这个问题的一些话听起来很乱。如何在main中编写函数调用仅取决于它在a.h中的声明。 a.c的存在与否不会改变这一点。当然没有任何涉及宏或函数指针。
编译和链接是两个截然不同的步骤;编译器会检查您是否传递了正确数量和类型的参数,并根据函数的声明将结果分配给正确类型的对象,而链接器尝试在机器代码中解析对函数实现的引用。
编译和链接的结果是二元污泥,可能与原始源代码 1 有任何明显的关系。调试版本保留不同级别的信息以支持源级调试器,但您几乎可以依赖于不保留任何有用源信息的发行版本。