[英]Functions and header files (ansi c)
这是来自求职面试的一个问题。假设我们有一个带有某些功能的“ ac”源文件,并以“ ah”作为头文件。还有我们调用该函数的main.c文件。现在,我们假设有“ ah”和“ ao”(目标文件)和ac不可用。我们现在如何调用此函数? (我有一个提示,我们需要使用函数指针。另一个提示是使用预编译器指令(例如#define和#ifndef)来执行此操作)。 我也想知道在.h文件中如何知道我们是否正确链接到源文件? 谢谢
只要在main.c中包含ah,就可以使用在ah中声明的函数,然后使用与ao相同的编译器版本进行编译:
gcc -c main.c
gcc main.o a.o
要编译main.c,您需要函数定义。 你已经在那啊,所以你会写:
// 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
不需要函数指针或宏。
描述方式只需要一个头文件即可调用该函数。 头文件包含函数的原型,使编译器可以知道函数的签名是什么。
然后,您将链接到目标文件(其中包含函数的编译版本),一切正常。
我不知道为什么您需要函数指针或预编译器指令。 也许您不明白这个问题100%?
在main.c中,正常调用该函数。
然后将main.c编译为main.o。 gcc -c main.c
然后链接ao和main.o。 gcc main.o ao
关于这个问题的某些内容听起来很乱。 您如何在main中编写函数调用仅取决于其在ah中的声明 。ac的存在与否都不会改变。 当然不涉及宏或函数指针。
编译和链接是两个不同的步骤。 编译器会检查您是否传递了正确的参数数目和类型,并根据函数的声明将结果分配给正确的对象类型,而链接器尝试在机器代码中解析对函数实现的引用。
编译和链接的结果是二进制污泥,该污泥可能与原始源代码1没有明显的关系。 调试版本会保留各种级别的信息以支持源代码级调试器,但是您几乎可以依赖发行版而不保留任何有用的源信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.