繁体   English   中英

函数和头文件(ansi c)

[英]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没有明显的关系。 调试版本会保留各种级别的信息以支持源代码级调试器,但是您几乎可以依赖发行版而不保留任何有用的源信息。


1.一次又一次有人要求提供一种从可执行文件中恢复源代码的工具; 这通常被描述为试图将汉堡包变回奶牛。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM