簡體   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