tags:

views:

72

answers:

5

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

+2  A: 

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
Johan
I agree that this is the correct solution, but I have a feeling the person asked the question incorrectly. The hints don't have anything to do with the situation.
mathepic
@mathepic: True, but the best thing I can do is answering the question. :)
Johan
A: 

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

mathepic
+2  A: 

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.

Jonathan Sternberg
+2  A: 

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%?

Starkey
A: 
John Bode