Функции и заголовочные файлы (ANSI C) - PullRequest
0 голосов
/ 20 августа 2010

Это вопрос из собеседования. Допустим, у нас есть исходный файл «ac» с некоторой функцией и «ah» в качестве заголовочного файла. Также у нас есть файл main.c, который вызывает эту функцию. Теперь давайте предположим, что у нас есть » Ах "и" AO "(объектный файл) и AC недоступен. Как мы теперь вызываем эту функцию? (У меня был намек на то, что нам нужно использовать указатели на функции. Другой совет - сделать это, используя директивы прекомпилятора, такие как #define и #ifndef). Также я хотел бы знать, как в файле .h мы знаем, правильно ли мы связаны с исходным файлом? Спасибо

Ответы [ 5 ]

2 голосов
/ 20 августа 2010

Как вы описываете, вам нужен только заголовочный файл для вызова функции. Заголовочный файл содержит прототип функции, который позволяет компилятору узнать, что является сигнатурой функции.

Затем вы бы связали свой объектный файл (который содержит скомпилированную версию функции), и все было бы в порядке.

Я не знаю, зачем вам нужны указатели на функции или директивы прекомпилятора. Может быть, вы не поняли вопрос на 100%?

2 голосов
/ 20 августа 2010

Для компиляции 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

Не нужны указатели функций или макросы.

2 голосов
/ 20 августа 2010

Просто включите a.h из main.c, и вы сможете использовать функции, объявленные в a.h. Затем просто скомпилируйте его с той же версией компилятора, что и a.o build:

gcc -c main.c
gcc main.o a.o
0 голосов
/ 21 августа 2010

Что-то в этом вопросе звучит искаженно. То, как вы пишете вызов функции в main, зависит исключительно от ее объявления в a.h. Наличие или отсутствие a.c не меняет этого. Конечно, ничего, связанного с макросами или указателями на функции.

Компиляция и компоновка - это два разных шага; компилятор проверяет, что вы передаете правильное число и типы аргументов и присваиваете результат нужному типу объекта на основе объявления функции, в то время как компоновщик пытается разрешить ссылку на реализацию функции в машинном коде.

Результатом компиляции и компоновки является бинарный шлам, который может иметь или не иметь какой-либо очевидной связи с исходным исходным кодом 1 . Отладочные версии сохраняют различные уровни информации для поддержки отладчиков исходного уровня, но вы можете в значительной степени полагаться на версии выпуска, не сохраняющие любую полезную исходную информацию.


1. Время от времени кто-то просит инструмент для восстановления исходного кода из исполняемого файла; это часто называют попыткой превратить гамбургер в корову.
0 голосов
/ 20 августа 2010

В main.c вызывайте функцию как обычно.

Затем скомпилируйте main.c в main.o. gcc -c main.c

Затем свяжите a.o и main.o. gcc main.o a.o

...