user426639
user426639

Reputation: 21

Functions and header files (ansi c)

This is a question from job interview.Let's say we have "a.c" source file with some function and "a.h" as its header file.Also we have main.c file which calls that function.Now let's suppose we have "a.h" and "a.o"(object file) and a.c is unavailable.How do we call this function now? (I had a hint that we need to use function pointers.Another hint is to do this using pre-compiler directives such as #define and #ifndef). Also i would like to know how in .h file we know if we are linked properly to source file? Thank You

Upvotes: 0

Views: 1467

Answers (5)

John Bode
John Bode

Reputation: 123578

Something about this question sounds garbled. How you write the function call in main depends solely on its declaration in a.h. The presence or absence of a.c doesn't change that. Certainly nothing involving macros or function pointers.

Compiling and linking are two distinct steps; the compiler checks that you're passing the right number and types of arguments and assigning the result to the right type of object based on the function's declaration, while the linker attempts to resolve the reference to the function's implementation in the machine code.

The result of compiling and linking is a binary sludge that may or may not have any obvious relationship to the original source code1. Debug versions preserve varying levels of information to support source-level debuggers, but you can pretty much rely on release versions not preserving any useful source information.


1. Every now and again someone asks for a tool to recover source code from an executable; this is often described as attempting to turn hamburger back into cows.

Upvotes: 0

Starkey
Starkey

Reputation: 9781

The way you describe it, you only need a header file to call the function. The header file contains the prototype of the function, which allows the compiler to know what the signature of the function is.

You would then link in your object file (which contains the compiled version of function) and everything would be OK.

I don't know why you would need functions pointers or pre-compiler directives. Maybe you didn't understand the question 100%?

Upvotes: 2

Jonathan Sternberg
Jonathan Sternberg

Reputation: 6677

To compile main.c, you need the function definition. You already have that in a.h. So you would write:

// main.c
#include "a.h"

int main()
{
    foobar(); // Let's say this is the function from a.h
}

When compiling it, you would have to include the object file at the linking stage. So using gcc...

gcc -c main.c // Compile main.c to main.o
gcc -o main main.o a.o

No function pointers or macros needed.

Upvotes: 2

alternative
alternative

Reputation: 13042

In main.c, call the function as normal.

Then compile main.c to main.o. gcc -c main.c

Then link a.o and main.o. gcc main.o a.o

Upvotes: 0

Johan
Johan

Reputation: 5063

Just include a.h from main.c and you can use the functions declared in a.h. Then just compile it with the same compiler version as a.o is build:

gcc -c main.c
gcc main.o a.o

Upvotes: 2

Related Questions