Calling C++ functions from C file

22,858

Solution 1

Short answer:

example.cpp should include example.h.

Longer answer:

When you declare a function in C++, it has C++ linkage and calling conventions. (In practice the most important feature of this is name mangling - the process by which a C++ compiler alters the name of a symbol so that you can have functions with the same name that vary in parameter types.) extern "C" (present in your header file) is your way around it - it specifies that this is a C function, callable from C code, eg. not mangled.

You have extern "C" in your header file, which is a good start, but your C++ file is not including it and does not have extern "C" in the declaration, so it doesn't know to compile it as a C function.

Solution 2

the extern "C" tells C++ that the declared function has to use the C ABI (Application Binary interface), hence, whether the language is C or C++, your void HelloWorld() is always seen externally as it is C.

But you implemented it in the cpp file like it is a C++ one, C is not aware of.

You have to make the prototype of HelloWorld coherent for both C and C++, so the cpp file should declare it as extern "C" void Helloworld() { /*your code here*/ }, or simply, #include "example.h" from example.cpp, so that, before implementing it, the compiler already knows it has to follow the C convention.

Share:
22,858
user1702375
Author by

user1702375

Updated on September 27, 2020

Comments

  • user1702375
    user1702375 over 3 years

    I am quite new to C and C++. But I have some C++ functions which I need to call them from C. I made an example of what I need to do


    main.c:

    #include "example.h"      
    #include <stdio.h>
    
    int main(){   
        helloWorld();
        return 0;
    }
    

    example.h:

     #ifndef HEADER_FILE
     #define HEADER_FILE
    
     #ifdef __cplusplus
         extern "C" {
     #endif
             void helloWorld();
     #ifdef __cplusplus
         }
     #endif
    
     #endif
    

    example.cpp:

    #include <iostream.h>
    
    void helloWorld(){
        printf("hello from CPP");
    } 
    

    It just doesn't work. I still receive the error of undefined reference to _helloWorld in my main.c. Where is the the problem?