Connecting Tech Pros Worldwide Forums | Help | Site Map

C++ code with C-style interface for a library to be used in C++ and C?

Koen
Guest
 
Posts: n/a
#1: Jul 19 '05
Hi!

I have a question about building and then using libraries containing
C++ code.

Let's say I have some C++ code and a .cpp file with 1 function that
uses some other C++ code / classes etc... Also, any possible exception
is handled within the function itself.

In code:

MyModule.h
----------
#ifndef MYMODULE_H
#define MYMODULE_H

extern int Test(float inParam1,float inParam2,float* outResult);

#endif // #ifndef MYMODULE_H

MyModule.cpp
------------
#include "MyModule.h"
#include "MyClasses.h" // contains MyClassA and MyClassB

int Test(float inParam1,float inParam2,float* outResult)
{
int theResult = 0;
try
{
MyClassA a;
a.Setup(inParam1);
MyClassB b;
b.Setup(inParam2);
*outResult = a.Process(b);
}
catch (...)
{
theResult = -1;
}
return theResult;
}

Now, I would like to build a library that is callable from C++ AND
from C that exposes the functionality of that Test function (I just
gave an example with 1 single function, but in practice there are
more).

Currently, when I build the library, it is compiled using the C++
compiler (of course, since I really use C++ classes and so on), and I
can use the library from a C++ program (.cpp file with main), as
should...

But I can't seem to find out how to make that function accessible to a
C program (.c file with main). I get an error like "unresolved
external symbol _Test", and I know that it probably has something to
do with the name mangling in C++ being different from C...
Considering the fact that the *interface* of the library does not
contain any C++ specific things, and handles all possible exceptions
internally, it should be possible to use it in C too, right?

Can someone please explain me how to do that?
Thanks in advance!

Koen

PS
If someone wants the test code, I can post/send them on request.



Koen
Guest
 
Posts: n/a
#2: Jul 19 '05

re: C++ code with C-style interface for a library to be used in C++ and C?


"Koen" <no@ssppaamm.com> wrote in message
news:bkf0gh$smr$1@gaudi2.UGent.be...[color=blue]
> Hi!
>
> I have a question about building and then using libraries containing
> C++ code.
>
> Let's say I have some C++ code and a .cpp file with 1 function that
> uses some other C++ code / classes etc... Also, any possible[/color]
exception[color=blue]
> is handled within the function itself.
>
> In code:
>
> MyModule.h
> ----------
> #ifndef MYMODULE_H
> #define MYMODULE_H
>
> extern int Test(float inParam1,float inParam2,float* outResult);
>
> #endif // #ifndef MYMODULE_H[/color]

OK. Seems like all I needed to do was this:

#ifndef MYMODULE_H
#define MYMODULE_H

#ifdef __cplusplus
extern "C" {
#endif

int Test(float inParam1,float inParam2,float* outResult);

#ifdef __cplusplus
}
#endif

#endif // #ifndef MYMODULE_H


Only thing I'm not sure of anymore is whether I should still keep the
"extern" in front of my function (so that also in the C case there is
an "extern"):

extern int Test(float inParam1,float inParam2,float* outResult);

Does that still have any use?

Koen


Julián Albo
Guest
 
Posts: n/a
#3: Jul 19 '05

re: C++ code with C-style interface for a library to be used in C++ and C?


Koen escribió:
[color=blue]
> But I can't seem to find out how to make that function accessible to a
> C program (.c file with main). I get an error like "unresolved
> external symbol _Test", and I know that it probably has something to
> do with the name mangling in C++ being different from C...[/color]

Declare your function as extern "C".

Regards.
Mike Wahler
Guest
 
Posts: n/a
#4: Jul 19 '05

re: C++ code with C-style interface for a library to be used in C++ and C?



"Koen" <no@ssppaamm.com> wrote in message
news:bkf439$tr2$1@gaudi2.UGent.be...[color=blue]
> "Koen" <no@ssppaamm.com> wrote in message
> news:bkf0gh$smr$1@gaudi2.UGent.be...[color=green]
> > Hi!
> >
> > I have a question about building and then using libraries containing
> > C++ code.
> >
> > Let's say I have some C++ code and a .cpp file with 1 function that
> > uses some other C++ code / classes etc... Also, any possible[/color]
> exception[color=green]
> > is handled within the function itself.
> >
> > In code:
> >
> > MyModule.h
> > ----------
> > #ifndef MYMODULE_H
> > #define MYMODULE_H
> >
> > extern int Test(float inParam1,float inParam2,float* outResult);
> >
> > #endif // #ifndef MYMODULE_H[/color]
>
> OK. Seems like all I needed to do was this:
>
> #ifndef MYMODULE_H
> #define MYMODULE_H
>
> #ifdef __cplusplus
> extern "C" {
> #endif
>
> int Test(float inParam1,float inParam2,float* outResult);
>
> #ifdef __cplusplus
> }
> #endif
>
> #endif // #ifndef MYMODULE_H
>
>
> Only thing I'm not sure of anymore is whether I should still keep the
> "extern" in front of my function (so that also in the C case there is
> an "extern"):
>
> extern int Test(float inParam1,float inParam2,float* outResult);[/color]

In both C and C++, functions are 'extern' by default,
and need not be qualified as such.

The use of 'extern' with 'extern "C"' has a special
purpose meaning, used for the interlanguage interface.
[color=blue]
>
> Does that still have any use?[/color]

No, it never did. :-)

-Mike


Koen
Guest
 
Posts: n/a
#5: Jul 19 '05

re: C++ code with C-style interface for a library to be used in C++ and C?


"Mike Wahler" <mkwahler@mkwahler.net> wrote in message
news:fhHab.8773$UN4.8539@newsread3.news.pas.earthl ink.net...
[color=blue]
> In both C and C++, functions are 'extern' by default,
> and need not be qualified as such.
>
> The use of 'extern' with 'extern "C"' has a special
> purpose meaning, used for the interlanguage interface.
>[color=green]
> >
> > Does that still have any use?[/color]
>
> No, it never did. :-)[/color]

OK. Thanks for the info!
Koen


Jack Klein
Guest
 
Posts: n/a
#6: Jul 19 '05

re: C++ code with C-style interface for a library to be used in C++ and C?


On Fri, 19 Sep 2003 15:49:33 +0200, "Koen" <no@ssppaamm.com> wrote in
comp.lang.c++:
[color=blue]
> Hi!
>
> I have a question about building and then using libraries containing
> C++ code.
>
> Let's say I have some C++ code and a .cpp file with 1 function that
> uses some other C++ code / classes etc... Also, any possible exception
> is handled within the function itself.
>
> In code:
>
> MyModule.h
> ----------
> #ifndef MYMODULE_H
> #define MYMODULE_H
>
> extern int Test(float inParam1,float inParam2,float* outResult);
>
> #endif // #ifndef MYMODULE_H
>
> MyModule.cpp
> ------------
> #include "MyModule.h"
> #include "MyClasses.h" // contains MyClassA and MyClassB
>
> int Test(float inParam1,float inParam2,float* outResult)
> {
> int theResult = 0;
> try
> {
> MyClassA a;
> a.Setup(inParam1);
> MyClassB b;
> b.Setup(inParam2);
> *outResult = a.Process(b);
> }
> catch (...)
> {
> theResult = -1;
> }
> return theResult;
> }
>
> Now, I would like to build a library that is callable from C++ AND
> from C that exposes the functionality of that Test function (I just
> gave an example with 1 single function, but in practice there are
> more).
>
> Currently, when I build the library, it is compiled using the C++
> compiler (of course, since I really use C++ classes and so on), and I
> can use the library from a C++ program (.cpp file with main), as
> should...
>
> But I can't seem to find out how to make that function accessible to a
> C program (.c file with main). I get an error like "unresolved
> external symbol _Test", and I know that it probably has something to
> do with the name mangling in C++ being different from C...
> Considering the fact that the *interface* of the library does not
> contain any C++ specific things, and handles all possible exceptions
> internally, it should be possible to use it in C too, right?
>
> Can someone please explain me how to do that?
> Thanks in advance!
>
> Koen
>
> PS
> If someone wants the test code, I can post/send them on request.
>[/color]

You probably can't use C++ code that does things like throwing and
catching exceptions from inside a C program.

While this is implementation specific, it is often necessary on many
platforms for a program containing mixed C and C++ object modules to
have the start-up and main() in C++. It is quite possible that the C
environment created by the C compiler for a C executable will not have
appropriate support for C++ only features such as exceptions.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++ ftp://snurse-l.org/pub/acllc-c++/faq
Closed Thread