Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C and C++ linkage with extern "C"

I have a C++ function defined in a .h file as follows and implemented in a .cpp file:

extern "C" void func(bool first, float min, float* state[6], float* err[6][6])
{
    //uses vectors and classes and other C++ constructs
}

How can I call func in a C file? How do I set up my file architecture / makefile to compile this?

Thanks!

like image 652
CodeKingPlusPlus Avatar asked Dec 02 '22 21:12

CodeKingPlusPlus


2 Answers

You call the function from C in the normal way. However, you need to wrap the extern "C" in an preprocessor macro to prevent the C compiler from seeing it:

#ifndef __cplusplus
extern "C"
#endif
void func(bool first, float min, float* state[6], float* err[6][6]);

Assuming you're working with GCC, then compile the C code with gcc, compile the C++ code with g++, and then link with g++.

like image 194
Oliver Charlesworth Avatar answered Dec 11 '22 04:12

Oliver Charlesworth


To call it in C, all you need to do is call it normally. Because you told the compiler to use the C calling conventions and ABI with extern "C", you can call it normally:

func(args);

To compiler, use this for the C++:

g++ -c -o myfunc.o myfunc.cpp

Then this for the C:

gcc -c -o main.o somec.c

Than link:

g++ -o main main.o myfunc.o

Make sure that the C++ header for the function uses ONLY C CONSTRUCTS. So include things like <vector> in the .cpp file instead.

like image 45
Linuxios Avatar answered Dec 11 '22 05:12

Linuxios