Being an experienced C/C++ developer, sometimes there are modules in which the code layer which interact with the system is written in C while the layer above it is written in C++. Have you ever thought of how these two layers (one written in C and other in C++) interact? What if we want to call a function to/from C/C++ to C++/C layer. Well, lets understand the concept of mixing C/C++ code today.
Well, fortunately there is not much of a difficulty in compiling a C code with a C++ compiler except that you need to keep this thing in mind that C++ compiler could complain on the coding style as some specifications have changed from C to C++.
We will understand but first lets compile a C Code using C++ :
So we see that the above written code is a pure C code which should print 'Hello World' on execution.
Now lets compile and run the code :
So we see that we compiled the code with gnu C++ compiler g++ and it compiled successfully. When we executed the binary, the output came as expected.
Now, lets focus on the other part that I mentioned earlier. That is, though C++ compiler can compile C code but since C++ compiler has its own rules so there could be some changes in the C code to comply it with C++ standards. For example, consider this :
The code above is a valid C code but when I used g++ to compile it, I got :
We see that there was an error saying that malloc() returns a void* but you are capturing it in char*, hence this operation is invalid. Well, to cut the long explanation short, C++ compiler expects explicit typecasting while using malloc while C compiler does not. Now since we are compiling C code with C++ compiler so we need to comply with C++ coding standards. Hence the code was changed to :
We added an explicit typecast to the return of malloc() and now when I compile and execute the code above :
We see that the code compiled and executed properly.
Well, to do this the only effort required is to use the identifier :
extern "C"
to wrap the C header file inclusion. This helps the C++ compiler to understand that the functions declared/defined in this header are C functions and should be treated accordingly.
For example :
Another possible way of including a C header is to bring in the identifier extern "C" onto the top of your header file and wrap around all the
file. For example :
Paste this as starting of your header :
and this at the end of your header :
Suppose you have a C function which you want to call from a c++ code but somehow you do not want to include the C header where the function is declared. In this case we can again use extern "C" to declare the function in C++ source and then we can freely call it from the C++ code.
Lets take an example :
In the above code we have declared a C function func() under the extern "C" tag and made a call to the same function in the main() of this cpp file.
Lets compile the above code :
Since this is a C++ file so we compile it with g++ using -c option to get the object file main.o.
Now, lets see where function func() is defined?
We have the file func.c containing the above code in the same directory as main.c. The above code defines the function func().
Lets compile it :
Since its a C code so we used gcc to compile it. The output we got is func.o
Now, lets link these two object files and execute the executable:
Whola!!!....the object files linked correctly and on execution, the C function func() got called from cpp code and executed correctly.
Suppose you have a C++ function that you want to call from C code. In this case again we use extern "C". Lets look at the code :
Note that we have defined function fun() with extern "C". Now, lets see the C file code :
Now when you compile and run the code as :
Whola!!!! the cpp function got called from C code.
To conclude, In this article we understood how to mix C/c++ code and saw that how can we call a C function from C++ code and vice versa.
Stay tuned for more!!!
Compiling C code using C++ compiler
Well, fortunately there is not much of a difficulty in compiling a C code with a C++ compiler except that you need to keep this thing in mind that C++ compiler could complain on the coding style as some specifications have changed from C to C++.
We will understand but first lets compile a C Code using C++ :
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
printf("\n Hello World\n");
return 0;
}
Now lets compile and run the code :
Code:
~/practice $ g++ -Wall segfault.c -o segfault ~/practice $ ./segfault Hello World
Now, lets focus on the other part that I mentioned earlier. That is, though C++ compiler can compile C code but since C++ compiler has its own rules so there could be some changes in the C code to comply it with C++ standards. For example, consider this :
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
printf("\n Hello World\n");
char *p = malloc(10);
free(p);
return 0;
}
Code:
~/practice $ g++ -Wall segfault.c -o segfault segfault.c: In function ‘int main()’: segfault.c:11: error: invalid conversion from ‘void*’ to ‘char*’
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
printf("\n Hello World\n");
char *p = (char*)malloc(10);
free(p);
return 0;
}
Code:
$ g++ -Wall segfault.c -o segfault ~/practice $ ./segfault Hello World
How to include a non-system C header in C++ code
Well, to do this the only effort required is to use the identifier :
extern "C"
to wrap the C header file inclusion. This helps the C++ compiler to understand that the functions declared/defined in this header are C functions and should be treated accordingly.
For example :
Code:
// In C++ code
extern "C" {
#include "C_Code.h"
}
// Now call any function declared/defined in C_Code.h in this C++ file
...
...
...
file. For example :
Paste this as starting of your header :
Code:
#ifdef __cplusplus
extern "C" {
#endif
Code:
#ifdef __cplusplus } #endif
Calling a non-system C function from C++ code
Suppose you have a C function which you want to call from a c++ code but somehow you do not want to include the C header where the function is declared. In this case we can again use extern "C" to declare the function in C++ source and then we can freely call it from the C++ code.
Lets take an example :
Code:
#include<iostream>
extern "C" {
void func();
}
int main(void)
{
func();
return 0;
}
Lets compile the above code :
Code:
~/practice $ g++ -c main.cpp
Now, lets see where function func() is defined?
Code:
#include<stdio.h>
void func()
{
printf("\n Inside func()\n");
}
Lets compile it :
Code:
~/practice $ gcc -c func.c
Now, lets link these two object files and execute the executable:
Code:
~/practice $ g++ func.o main.o -o func ~/practice $ ./func Inside func()
Calling a non-system C++ function from C code
Suppose you have a C++ function that you want to call from C code. In this case again we use extern "C". Lets look at the code :
Code:
#include<iostream>
#include<stdio.h>
extern "C" {
void func();
}
extern "C" void fun()
{
printf("\n inside fun()\n");
}
int main(void)
{
func();
return 0;
}
Code:
#include<stdio.h>
extern void fun();
void func()
{
printf("\n Inside func()\n");
fun();
}
Code:
~/practice $ g++ -c main.cpp ~/practice $ gcc -c func.c ~/practice $ g++ main.o func.o -o func ~/practice $ ./func Inside func() inside fun()
Conclusion
To conclude, In this article we understood how to mix C/c++ code and saw that how can we call a C function from C++ code and vice versa.
Stay tuned for more!!!
