Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > C++ code with C-style interface for a library to be used in C++ and C?

Reply
Thread Tools

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

 
 
Koen
Guest
Posts: n/a
 
      09-19-2003
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.


 
Reply With Quote
 
 
 
 
Koen
Guest
Posts: n/a
 
      09-19-2003
"Koen" <> wrote in message
news:bkf0gh$smr$...
> 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


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


 
Reply With Quote
 
 
 
 
=?iso-8859-1?Q?Juli=E1n?= Albo
Guest
Posts: n/a
 
      09-19-2003
Koen escribió:

> 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...


Declare your function as extern "C".

Regards.
 
Reply With Quote
 
Mike Wahler
Guest
Posts: n/a
 
      09-19-2003

"Koen" <> wrote in message
news:bkf439$tr2$...
> "Koen" <> wrote in message
> news:bkf0gh$smr$...
> > 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

>
> 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);


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.

>
> Does that still have any use?


No, it never did.

-Mike


 
Reply With Quote
 
Koen
Guest
Posts: n/a
 
      09-19-2003
"Mike Wahler" <> wrote in message
news:fhHab.8773$ ink.net...

> 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.
>
> >
> > Does that still have any use?

>
> No, it never did.


OK. Thanks for the info!
Koen


 
Reply With Quote
 
Jack Klein
Guest
Posts: n/a
 
      09-20-2003
On Fri, 19 Sep 2003 15:49:33 +0200, "Koen" <> wrote in
comp.lang.c++:

> 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.
>


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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
I am buying all of the below Cisco equipment USED OR NEW. NOTE someline items say new or used, but I will buy them in both conditions. network buyer VOIP 0 12-23-2010 01:26 AM
Can Groovy be used in an applet and/or can it generate the Java bytecodes that then can be used in an applet? Casey Hawthorne Java 1 03-18-2009 12:56 AM
Is there a perl package, or data in a form easily used by a perlscript, that can be used to determine when to change to or from daylightsavings time? Ted Byers Perl Misc 23 11-15-2008 05:53 PM
static nat between phisical interface and virtual interface on same ethernet Andrea Cisco 0 04-19-2004 09:37 AM
Unreadable file on Canon S 400.I used a I used a Joseph Miller Digital Photography 3 01-13-2004 09:40 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57